Suportado por
*Requer a Edição Enterprise do sgcWebSockets. Em outras edições, iniciar um servidor com Negotiate habilitado gera a exceção "Negotiate authentication requires sgcWebSockets Enterprise".
Negotiate é o esquema de autenticação HTTP por trás da autenticação integrada do Windows. O cliente prova sua identidade com Kerberos (SPNEGO) ou, no Windows, recorre ao NTLM, de modo que usuários que já estão conectados a um domínio se conectam sem digitar uma senha. Navegadores em uma zona de intranet, curl --negotiate e clientes .NET que usam credenciais padrão podem responder ao desafio.
Authentication.Negotiate.Enabled (Boolean, padrão False): habilita o Negotiate. Requer Authentication.Enabled.Authentication.Negotiate.ServicePrincipal (String): SPN opcional, como HTTP/host.example.com@EXAMPLE.COM. Quando vazio, qualquer chave do keytab ou da conta da máquina é aceita. Somente servidores Indy, ignorado pelo http.sys.Authentication.Negotiate.Keytab (String): somente Linux, caminho do keytab de serviço. Quando vazio, é usado KRB5_KTNAME ou o padrão do sistema. Ignorado no Windows e pelo http.sys.OnNegotiateAuthentication(Connection: TsgcWSConnection; const aPrincipal: String; var Authenticated: Boolean): disparado quando a troca Kerberos ou NTLM é concluída. Authenticated chega como True, portanto, sem um handler, todo principal autenticado pelo Windows ou pelo Kerberos é aceito. Defina-o como False para rejeitar (o cliente recebe 401). O principal é DOMAIN\user no Windows e user@REALM no Linux. Nos servidores Indy, ele pode ser lido depois como TsgcWSConnectionServer(Connection).Authentication.User, com AuthType = authNegotiate.O servidor a seguir aceita apenas dois principais. O evento restringe o acesso pelo nome do principal.
uses
sgcWebSocket, sgcWebSocket_Classes;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
oServer: TsgcWebSocketHTTPServer;
procedure OnNegotiateAuthenticationEvent(Connection: TsgcWSConnection;
const aPrincipal: String; var Authenticated: Boolean);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
oServer := TsgcWebSocketHTTPServer.Create(Self);
oServer.Port := 8080;
oServer.Authentication.Enabled := True;
oServer.Authentication.Negotiate.Enabled := True;
oServer.Authentication.Negotiate.ServicePrincipal :=
'HTTP/host.example.com@EXAMPLE.COM';
oServer.OnNegotiateAuthentication := OnNegotiateAuthenticationEvent;
oServer.Active := True;
end;
procedure TForm1.OnNegotiateAuthenticationEvent(Connection: TsgcWSConnection;
const aPrincipal: String; var Authenticated: Boolean);
begin
Authenticated := SameText(aPrincipal, 'EXAMPLE\alice') or
SameText(aPrincipal, 'EXAMPLE\bob');
end;
No Linux, defina Authentication.Negotiate.Keytab com o caminho do keytab, por exemplo /etc/sgc/http.keytab, e use um principal Kerberos como alice@EXAMPLE.COM no evento.
401 com WWW-Authenticate: Negotiate, além do desafio de realm Basic quando o Basic também está habilitado.Authorization: Negotiate <token>.Authentication.AllowNonAuth é True, uma requisição sem credenciais é aceita anonimamente, e uma requisição que carrega um token Negotiate continua sendo autenticada.curl --negotiate -u : http://host.example.com:8080/
HTTP/host. Os navegadores enviam Negotiate apenas para sites da zona de intranet ou das listas permitidas.Keytab para ele.