Obsługiwane przez
*Wymaga sgcWebSockets Enterprise Edition. W innych edycjach uruchomienie serwera z włączonym Negotiate zgłasza wyjątek "Negotiate authentication requires sgcWebSockets Enterprise".
Negotiate to schemat uwierzytelniania HTTP stojący za zintegrowanym uwierzytelnianiem systemu Windows. Klient potwierdza swoją tożsamość za pomocą Kerberos (SPNEGO) lub, w systemie Windows, przechodzi awaryjnie na NTLM, dzięki czemu użytkownicy już zalogowani do domeny łączą się bez wpisywania hasła. Na wyzwanie mogą odpowiedzieć przeglądarki w strefie intranetu, curl --negotiate oraz klienty .NET używające domyślnych poświadczeń.
Authentication.Negotiate.Enabled (Boolean, domyślnie False): włącza Negotiate. Wymaga Authentication.Enabled.Authentication.Negotiate.ServicePrincipal (String): opcjonalna nazwa SPN, na przykład HTTP/host.example.com@EXAMPLE.COM. Gdy jest pusta, akceptowany jest dowolny klucz z pliku keytab lub konto komputera. Dotyczy tylko serwerów Indy, w http.sys jest ignorowana.Authentication.Negotiate.Keytab (String): tylko Linux, ścieżka do pliku keytab usługi. Gdy jest pusta, używana jest zmienna KRB5_KTNAME lub wartość domyślna systemu. Ignorowana w systemie Windows i w http.sys.OnNegotiateAuthentication(Connection: TsgcWSConnection; const aPrincipal: String; var Authenticated: Boolean): wywoływane po zakończeniu wymiany Kerberos lub NTLM. Parametr Authenticated ma na wejściu wartość True, więc bez procedury obsługi akceptowany jest każdy podmiot uwierzytelniony przez Windows lub Kerberos. Ustaw go na False, aby odrzucić (klient otrzyma 401). Podmiot ma postać DOMAIN\user w systemie Windows i user@REALM w systemie Linux. W serwerach Indy można go później odczytać jako TsgcWSConnectionServer(Connection).Authentication.User, przy AuthType = authNegotiate.Poniższy serwer akceptuje tylko dwa podmioty. Zdarzenie ogranicza dostęp według nazwy podmiotu.
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;
W systemie Linux ustaw Authentication.Negotiate.Keytab na ścieżkę do pliku keytab, na przykład /etc/sgc/http.keytab, a w zdarzeniu użyj podmiotu Kerberos, takiego jak alice@EXAMPLE.COM.
401 z nagłówkiem WWW-Authenticate: Negotiate, a gdy włączone jest także Basic, również z wyzwaniem Basic realm.Authorization: Negotiate <token>.Authentication.AllowNonAuth ma wartość True, żądanie bez poświadczeń jest akceptowane anonimowo, a żądanie z tokenem Negotiate jest nadal uwierzytelniane.curl --negotiate -u : http://host.example.com:8080/
HTTP/host. Przeglądarki wysyłają Negotiate tylko do witryn w strefie intranetu lub na listach dozwolonych.Keytab.