Ondersteund door
*Vereist sgcWebSockets Enterprise Edition. In andere edities genereert het starten van een server met ingeschakelde Negotiate de uitzondering "Negotiate authentication requires sgcWebSockets Enterprise".
Negotiate is het HTTP-authenticatieschema achter de geïntegreerde Windows-authenticatie. De client bewijst zijn identiteit met Kerberos (SPNEGO) of valt op Windows terug op NTLM, zodat gebruikers die al bij een domein zijn aangemeld verbinding maken zonder een wachtwoord in te typen. Browsers in een intranetzone, curl --negotiate en .NET-clients die standaardreferenties gebruiken kunnen de uitdaging allemaal beantwoorden.
Authentication.Negotiate.Enabled (Boolean, standaard False): schakelt Negotiate in. Vereist Authentication.Enabled.Authentication.Negotiate.ServicePrincipal (String): optionele SPN zoals HTTP/host.example.com@EXAMPLE.COM. Als de waarde leeg is, wordt elke sleutel in de keytab of het machineaccount geaccepteerd. Alleen voor Indy-servers, wordt door http.sys genegeerd.Authentication.Negotiate.Keytab (String): alleen Linux, pad van de service-keytab. Als de waarde leeg is, wordt KRB5_KTNAME of de systeemstandaard gebruikt. Wordt op Windows en door http.sys genegeerd.OnNegotiateAuthentication(Connection: TsgcWSConnection; const aPrincipal: String; var Authenticated: Boolean): wordt geactiveerd wanneer de Kerberos- of NTLM-uitwisseling is voltooid. Authenticated komt binnen als True, dus zonder handler wordt elke principal geaccepteerd die door Windows of Kerberos is geauthenticeerd. Stel de parameter in op False om te weigeren (de client krijgt 401). De principal is DOMAIN\user op Windows en user@REALM op Linux. Bij de Indy-servers kan deze daarna worden uitgelezen als TsgcWSConnectionServer(Connection).Authentication.User, met AuthType = authNegotiate.De volgende server accepteert slechts twee principals. De gebeurtenis beperkt de toegang op basis van de naam van de 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;
Stel op Linux Authentication.Negotiate.Keytab in op het pad van de keytab, bijvoorbeeld /etc/sgc/http.keytab, en gebruik in de gebeurtenis een Kerberos-principal zoals alice@EXAMPLE.COM.
401 met WWW-Authenticate: Negotiate, plus de Basic-realm-uitdaging wanneer Basic ook is ingeschakeld.Authorization: Negotiate <token>.Authentication.AllowNonAuth True is, en een verzoek met een Negotiate-token wordt nog steeds geauthenticeerd.curl --negotiate -u : http://host.example.com:8080/
HTTP/host nodig. Browsers sturen Negotiate alleen naar sites in de intranetzone of in de toegestane lijsten.Keytab ernaar verwijzen.