InitializeSecurityContext-Funktion (Kerberos)
Die Funktion InitializeSecurityContext (Kerberos) initiiert den clientseitigen ausgehenden Sicherheitskontext aus einem Anmeldeinformationshandle. Die Funktion wird verwendet, um einen Sicherheitskontext zwischen der Clientanwendung und einem Remotepeer zu erstellen. InitializeSecurityContext (Kerberos) gibt ein Token zurück, das der Client an den Remotepeer übergeben muss, den der Peer wiederum über den Aufruf AcceptSecurityContext (Kerberos) an die lokale Sicherheitsimplementierung übermittelt. Das generierte Token sollte von allen Aufrufenden als undurchsichtig betrachtet werden.
In der Regel wird die Funktion InitializeSecurityContext (Kerberos) in einer Schleife aufgerufen, bis ein ausreichender Sicherheitskontext eingerichtet ist.
Syntax
SECURITY_STATUS SEC_Entry InitializeSecurityContext(
_In_opt_ PCredHandle phCredential,
_In_opt_ PCtxtHandle phContext,
_In_ SEC_CHAR *pszTargetName,
_In_ ULONG fContextReq,
_In_ ULONG Reserved1,
_In_ ULONG TargetDataRep,
_In_opt_ PSecBufferDesc pInput,
_In_ ULONG Reserved2,
_Inout_opt_ PCtxtHandle phNewContext,
_Inout_opt_ PSecBufferDesc pOutput,
_Out_ PULONG pfContextAttr,
_Out_opt_ PTimeStamp ptsExpiry
);
Parameter
phCredential[in, optional]
Ein Handle für die von AcquireCredentialsHandle (Kerberos) zurückgegebenen Anmeldeinformationen. Dieses Handle wird verwendet, um den Sicherheitskontext zu erstellen. Die Funktion InitializeSecurityContext (Kerberos) erfordert mindestens AUSGEHENDe Anmeldeinformationen.
phContext[in, optional]
Ein Zeiger auf eine CtxtHandle-Struktur . Beim ersten Aufruf von InitializeSecurityContext (Kerberos) lautet NULL
dieser Zeiger . Beim zweiten Aufruf ist dieser Parameter ein Zeiger auf das Handle auf den teilgeformten Kontext, der im phNewContext-Parameter vom ersten Aufruf zurückgegeben wird.
Warnung
Verwenden Sie nicht dasselbe Kontexthandle bei gleichzeitigen Aufrufen von InitializeSecurityContext (Kerberos). Die API-Implementierung in den Sicherheitsdienstanbietern ist nicht threadsicher.
pszTargetName[in]
Ein Zeiger auf eine NULL-endende Zeichenfolge, die den Dienstprinzipalnamen (Service Principal Name, SPN) oder den Sicherheitskontext des Zielservers angibt.
Verwenden Sie einen vollqualifizierten Zielnamen, da Kurznamen nicht gesamtstrukturübergreifend unterstützt werden.
fContextReq[in]
Bitflags, die Anforderungen für den Kontext angeben. Nicht alle Pakete können alle Anforderungen unterstützen. Für diesen Parameter verwendete Flags wird ISC_REQ_ vorangestellt, z. B. ISC_REQ_DELEGATE. Bei diesem Parameter kann es sich um ein oder mehrere der folgenden Attribute-Flags handelt.
Wert | Bedeutung |
---|---|
ISC_REQ_ALLOCATE_MEMORY | Das Sicherheitspaket ordnet Ausgabepuffer für Sie zu. Wenn Sie die Verwendung der Ausgabepuffer abgeschlossen haben, geben Sie sie frei, indem Sie die Funktion FreeContextBuffer aufrufen. |
ISC_REQ_CONFIDENTIALITY | Verschlüsseln sie Nachrichten mithilfe der Funktion EncryptMessage . |
ISC_REQ_CONNECTION | Der Sicherheitskontext behandelt keine Formatierungsmeldungen. Dies ist der Standardwert. |
ISC_REQ_DELEGATE | Der Server kann den Kontext verwenden, um sich bei anderen Servern als Client zu authentifizieren. Das flag ISC_REQ_MUTUAL_AUTH muss festgelegt werden, damit dieses Flag funktioniert. Gültig für Kerberos. Ignorieren Sie dieses Flag für die eingeschränkte Delegierung. |
ISC_REQ_EXTENDED_ERROR | Wenn Fehler auftreten, wird die Remotepartei benachrichtigt. |
ISC_REQ_INTEGRITY | Signieren Sie Nachrichten, und überprüfen Sie Signaturen mithilfe der Funktionen EncryptMessage und MakeSignature . |
ISC_REQ_MUTUAL_AUTH | Die Richtlinie für die gegenseitige Authentifizierung des Diensts wird erfüllt. VORSICHT: Dies bedeutet nicht unbedingt, dass die gegenseitige Authentifizierung durchgeführt wird, nur dass die Authentifizierungsrichtlinie des Diensts erfüllt ist. Um sicherzustellen, dass die gegenseitige Authentifizierung durchgeführt wird, rufen Sie die Funktion QueryContextAttributes (Kerberos) auf. |
ISC_REQ_NO_INTEGRITY | Wenn dieses Flag festgelegt ist, wird das ISC_REQ_INTEGRITY-Flag ignoriert. |
ISC_REQ_REPLAY_DETECT | Erkennen wiedergegebener Nachrichten, die mithilfe der Funktionen EncryptMessage oder MakeSignature codiert wurden. |
ISC_REQ_SEQUENCE_DETECT | Erkennen von Nachrichten, die außerhalb der Reihenfolge empfangen werden. |
ISC_REQ_STREAM | Unterstützung einer streamorientierten Verbindung. |
ISC_REQ_USE_SESSION_KEY | Ein neuer Sitzungsschlüssel muss ausgehandelt werden. |
Die angeforderten Attribute werden vom Client möglicherweise nicht unterstützt. Weitere Informationen finden Sie im PfContextAttr-Parameter .
Weitere Beschreibungen der verschiedenen Attribute finden Sie unter Kontextanforderungen.
Reserviert1[in]
Dieser Parameter ist reserviert und muss auf null festgelegt werden.
TargetDataRep[in]
Die Datendarstellung, z. B. bytereihenfolge, auf dem Ziel. Dieser Parameter kann entweder SECURITY_NATIVE_DREP oder SECURITY_NETWORK_DREP sein.
pInput[in, optional]
Ein Zeiger auf eine SecBufferDesc-Struktur , die Zeiger auf die Puffer enthält, die als Eingabe für das Paket bereitgestellt werden. Sofern der Clientkontext nicht vom Server initiiert wurde, muss der Wert dieses Parameters beim ersten Aufruf der Funktion sein NULL
. Bei nachfolgenden Aufrufen der Funktion oder wenn der Clientkontext vom Server initiiert wurde, ist der Wert dieses Parameters ein Zeiger auf einen Puffer, der mit genügend Arbeitsspeicher belegt ist, um das vom Remotecomputer zurückgegebene Token zu speichern.
Reserviert2[in]
Dieser Parameter ist reserviert und muss auf null festgelegt werden.
phNewContext[in, out, optional]
Ein Zeiger auf eine CtxtHandle-Struktur . Beim ersten Aufruf von InitializeSecurityContext (Kerberos) empfängt dieser Zeiger das neue Kontexthandle. Beim zweiten Aufruf kann phNewContext mit dem im parameter phContext angegebenen Handle identisch sein.
phNewContext sollte niemals sein NULL
.
pOutput[in, out, optional]
Ein Zeiger auf eine SecBufferDesc-Struktur , die Zeiger auf die SecBuffer-Struktur enthält, die die Ausgabedaten empfängt. Wenn ein Puffer als SEC_READWRITE in der Eingabe eingegeben wurde, ist er bei der Ausgabe vorhanden. Das System ordnet einen Puffer für das Sicherheitstoken zu, wenn es angefordert wird (über ISC_REQ_ALLOCATE_MEMORY) und füllt die Adresse im Pufferdeskriptor für das Sicherheitstoken ein.
pfContextAttr[out]
Ein Zeiger auf eine Variable, um eine Reihe von Bitflags zu empfangen, die die Attribute des eingerichteten Kontexts angeben. Eine Beschreibung der verschiedenen Attribute finden Sie unter Kontextanforderungen.
Für diesen Parameter verwendete Flags wird ISC_RET vorangestellt, z. B. ISC_RET_DELEGATE. Eine Liste der gültigen Werte finden Sie im fContextReq-Parameter .
Überprüfen Sie erst nach sicherheitsbezogenen Attributen, bis der endgültige Funktionsaufruf erfolgreich zurückgegeben wird. Attributflags, die sich nicht auf die Sicherheit beziehen, z. B. das ASC_RET_ALLOCATED_MEMORY-Flag, können vor der endgültigen Rückgabe überprüft werden.
Hinweis
Bestimmte Kontextattribute können sich während der Aushandlung mit einem Remotepeer ändern.
ptsExpiry[out, optional]
Ein Zeiger auf eine TimeStamp-Struktur , die die Ablaufzeit des Kontexts empfängt. Es wird empfohlen, dass das Sicherheitspaket diesen Wert immer in Ortszeit zurückgibt. Da dieser Parameter optional ist, NULL
sollte für kurzlebige Clients übergeben werden.
Rückgabewert
Wenn die Funktion erfolgreich ist, gibt die Funktion einen der folgenden Erfolgscodes zurück.
Rückgabecode | Beschreibung |
---|---|
SEC_E_OK | Der Sicherheitskontext wurde erfolgreich initialisiert. Es ist kein weiterer InitializeSecurityContext-Aufruf (Kerberos) erforderlich. Wenn die Funktion ein Ausgabetoken zurückgibt, d. h. wenn das SECBUFFER_TOKEN in pOutput eine nicht zero-Länge aufweist, muss dieses Token an den Server gesendet werden. |
SEC_I_COMPLETE_AND_CONTINUE | Der Client muss CompleteAuthToken aufrufen und die Ausgabe dann an den Server übergeben. Der Client wartet dann auf ein zurückgegebenes Token und übergibt es in einem anderen Aufruf an InitializeSecurityContext (Kerberos). |
SEC_I_COMPLETE_NEEDED | Der Client muss die Erstellung der Nachricht abschließen und dann die Funktion CompleteAuthToken aufrufen. |
SEC_I_CONTINUE_NEEDED | Der Client muss das Ausgabetoken an den Server senden und auf ein Rückgabetoken warten. Das zurückgegebene Token wird dann in einem anderen Aufruf von InitializeSecurityContext (Kerberos) übergeben. Das Ausgabetoken kann leer sein. |
SEC_I_INCOMPLETE_CREDENTIALS | Verwenden Sie mit Schannel. Der Server hat die Clientauthentifizierung angefordert, und die angegebenen Anmeldeinformationen enthalten entweder kein Zertifikat oder das Zertifikat wurde nicht von einer Zertifizierungsstelle ausgestellt, der der Server vertraut. Weitere Informationen finden Sie unter Hinweise. |
Wenn die Funktion fehlschlägt, gibt die Funktion einen der folgenden Fehlercodes zurück.
Rückgabecode | Beschreibung |
---|---|
SEC_E_INSUFFICIENT_MEMORY | Es ist nicht genügend Arbeitsspeicher verfügbar, um die angeforderte Aktion abzuschließen. |
SEC_E_INTERNAL_ERROR | Es ist ein Fehler aufgetreten, der keinem SSPI-Fehlercode zugeordnet wurde. |
SEC_E_INVALID_HANDLE | Das an die Funktion übergebene Handle ist ungültig. |
SEC_E_INVALID_TOKEN | Der Fehler ist auf ein falsch formatiertes Eingabetoken zurückzuführen, z. B. ein bei der Übertragung beschädigtes Token, ein Token von falscher Größe oder ein Token, das an die falsche eingeschränkte Delegierung übergeben wurde. Das Übergeben eines Tokens an das falsche Paket kann passieren, wenn Client und Server die ordnungsgemäße eingeschränkte Delegierung nicht ausgehandelt haben. |
SEC_E_LOGON_DENIED | Fehler bei der Anmeldung. |
SEC_E_NO_AUTHENTICATING_AUTHORITY | Für die Authentifizierung konnte keine Autorität kontaktiert werden. Der Domänenname der authentifizierenden Partei kann falsch sein, die Domäne kann nicht erreichbar sein, oder es ist möglicherweise ein Vertrauensstellungsfehler aufgetreten. |
SEC_E_NO_CREDENTIALS | In der eingeschränkten Delegierung sind keine Anmeldeinformationen verfügbar. |
SEC_E_TARGET_UNKNOWN | Das Ziel wurde nicht erkannt. |
SEC_E_UNSUPPORTED_FUNCTION | Ein ungültiges Kontextattributeflag (ISC_REQ_DELEGATE oder ISC_REQ_PROMPT_FOR_CREDS) wurde im fContextReq-Parameter angegeben. |
SEC_E_WRONG_PRINCIPAL | Der Prinzipal, der die Authentifizierungsanforderung empfangen hat, ist nicht mit dem Prinzipal identisch, der an den parameter pszTargetName übergeben wurde. Dies deutet auf einen Fehler bei der gegenseitigen Authentifizierung hin. |
Bemerkungen
Der Aufrufer ist dafür verantwortlich, zu bestimmen, ob die endgültigen Kontextattribute ausreichend sind. Wenn z. B. Vertraulichkeit angefordert wurde, aber nicht eingerichtet werden konnte, können einige Anwendungen die Verbindung sofort herunterfahren.
Wenn Attribute des Sicherheitskontexts nicht ausreichen, muss der Client den teilweise erstellten Kontext durch Aufrufen der DeleteSecurityContext-Funktion freigeben.
Die Funktion InitializeSecurityContext (Kerberos) wird von einem Client verwendet, um einen ausgehenden Kontext zu initialisieren.
Für einen Sicherheitskontext mit zwei Beinen lautet die Aufrufsequenz wie folgt:
- Der Client ruft die Funktion auf, wobei phContext auf
NULL
festgelegt ist, und füllt den Pufferdeskriptor mit der Eingabenachricht aus. - Das Sicherheitspaket untersucht die Parameter und erstellt ein undurchsichtiges Token und platziert es im TOKEN-Element im Pufferarray. Wenn der fContextReq-Parameter das flag ISC_REQ_ALLOCATE_MEMORY enthält, weist das Sicherheitspaket den Arbeitsspeicher zu und gibt den Zeiger im TOKEN-Element zurück.
- Der Client sendet das im pOutput-Puffer zurückgegebene Token an den Zielserver. Der Server übergibt das Token dann als Eingabeargument in einem Aufruf der Funktion AcceptSecurityContext (Kerberos).
- AcceptSecurityContext (Kerberos) kann ein Token zurückgeben, das der Server für einen zweiten Aufruf von InitializeSecurityContext (Kerberos) an den Client sendet, wenn der erste Aufruf SEC_I_CONTINUE_NEEDED zurückgegeben hat.
Bei sicherheitsrelevanten Kontextenmit mehreren Beinen, z. B. der gegenseitigen Authentifizierung, lautet die Aufrufsequenz wie folgt:
- Der Client ruft die Funktion wie zuvor beschrieben auf, aber das Paket gibt den SEC_I_CONTINUE_NEEDED Erfolgscode zurück.
- Der Client sendet das Ausgabetoken an den Server und wartet auf die Antwort des Servers.
- Nach Erhalt der Antwort des Servers ruft der Client InitializeSecurityContext (Kerberos) erneut auf, wobei phContext auf das Handle festgelegt ist, das vom letzten Aufruf zurückgegeben wurde. Das vom Server empfangene Token wird im pInput-Parameter angegeben.
- Verwenden Sie den wert phContext nicht in gleichzeitigen Aufrufen von InitializeSecurityContext (Kerberos). Die Implementierung in den Sicherheitsanbietern ist nicht threadsicher.
Wenn der Server erfolgreich reagiert hat, gibt das Sicherheitspaket SEC_E_OK zurück, und es wird eine sichere Sitzung eingerichtet.
Wenn die Funktion eine der Fehlerantworten zurückgibt, wird die Antwort des Servers nicht akzeptiert, und die Sitzung wird nicht eingerichtet.
Wenn die Funktion SEC_I_CONTINUE_NEEDED, SEC_I_COMPLETE_NEEDED oder SEC_I_COMPLETE_AND_CONTINUE zurückgibt, werden die Schritte 2 und 3 wiederholt.
Zum Initialisieren eines Sicherheitskontexts sind je nach zugrunde liegendem Authentifizierungsmechanismus und den im fContextReq-Parameter angegebenen Optionen möglicherweise mehrere Aufrufe dieser Funktion erforderlich.
Die Parameter fContextReq und pfContextAttributes sind Bitmasken , die verschiedene Kontextattribute darstellen. Eine Beschreibung der verschiedenen Attribute finden Sie unter Kontextanforderungen. Der pfContextAttributes-Parameter ist bei jeder erfolgreichen Rückgabe gültig, aber nur bei der letzten erfolgreichen Rückgabe sollten Sie die Flags untersuchen, die sich auf Sicherheitsaspekte des Kontexts beziehen. Zwischenrücken können z. B. das ISC_RET_ALLOCATED_MEMORY-Flag festlegen.
Wenn das ISC_REQ_USE_SUPPLIED_CREDS-Flag festgelegt ist, muss das Sicherheitspaket nach einem SECBUFFER_PKG_PARAMS Puffertyp im pInput-Eingabepuffer suchen. Dies ist keine generische Lösung, ermöglicht aber bei Bedarf eine starke Kopplung von Sicherheitspaket und Anwendung.
Wenn ISC_REQ_ALLOCATE_MEMORY angegeben wurde, muss der Aufrufer den Arbeitsspeicher durch Aufrufen der FreeContextBuffer-Funktion freigeben.
Das Eingabetoken kann beispielsweise die Herausforderung eines LAN-Managers sein. In diesem Fall ist das Ausgabetoken die NTLM-verschlüsselte Antwort auf die Herausforderung.
Die Aktion, die der Client ausführt, hängt vom Rückgabecode dieser Funktion ab. Wenn der Rückgabecode SEC_E_OK ist, wird kein zweiter InitializeSecurityContext -Aufruf (Kerberos) ausgeführt, und es wird keine Antwort vom Server erwartet. Wenn der Rückgabecode SEC_I_CONTINUE_NEEDED ist, erwartet der Client ein Token als Antwort vom Server und übergibt es in einem zweiten Aufruf von InitializeSecurityContext (Kerberos). Der SEC_I_COMPLETE_NEEDED Rückgabecode gibt an, dass der Client die Erstellung der Nachricht abschließen und die Funktion CompleteAuthToken aufrufen muss. Der SEC_I_COMPLETE_AND_CONTINUE-Code enthält beide Aktionen.
Wenn InitializeSecurityContext (Kerberos) beim ersten (oder nur) Aufruf erfolgreich zurückgibt, muss der Aufrufer schließlich die DeleteSecurityContext-Funktion für das zurückgegebene Handle aufrufen, auch wenn der Aufruf auf einem späteren Abschnitt des Authentifizierungsaustauschs fehlschlägt.
Der Client kann InitializeSecurityContext (Kerberos) erneut aufrufen, nachdem er erfolgreich abgeschlossen wurde. Dies gibt dem Sicherheitspaket an , dass eine erneute Authentifizierung gewünscht ist.
Kernelmodusaufrufer weisen die folgenden Unterschiede auf: Der Zielname ist eine Unicode-Zeichenfolge , die mithilfe von VirtualAlloc im virtuellen Arbeitsspeicher zugeordnet werden muss. sie darf nicht aus dem Pool zugewiesen werden. Puffer, die in pInput und pOutput übergeben und bereitgestellt werden, müssen sich im virtuellen Arbeitsspeicher befinden, nicht im Pool.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows XP [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server 2003 [nur Desktop-Apps] |
Header | Sspi.h (einschließlich Security.h) |
Bibliothek | Secur32.lib |
DLL | Secur32.dll |
Weitere Informationen
AcceptSecurityContext (Kerberos)