Wie überprüfe ich die zwischengespeicherten Anmeldeinformationen eines Benutzers anhand einer Domain?

Wenn Sie sich bei Windows anmelden, sind Ihre Anmeldeinformationen zwischengespeichert. Dies ermöglicht es Ihnen, @ zu verwendEinmalige Anmeldun. Wenn Sie dann zu einem anderen Computer navigieren möchten,

\\hydrogen

du würdestnich Sie werden aufgefordert, Anmeldeinformationen einzugeben.

Windows nimmt Ihre:

aktueller Benutzername (gehashtes) Passwort

und versuchen Sie, sich automatisch zu authentifizieren. Das Interessante ist, dass dies auch funktioniert, wenn sich Ihre Workstation nicht in der Domäne befindet. Windows wirdautomatisc Verwenden Sie Ihren Benutzernamen und Ihr Kennwort, wenn Sie eine Verbindung zum Server herstellen. Und wenn Ihr:

loka Benutzername / Passwort entspricht einemDomai Benutzername Passwor

ie werden automatisch eingelassen.

Hübsches Bild

Das nennt manEinmalige Anmeldun. Sie melden sich einmal bei Windows an und Ihre zwischengespeicherten Anmeldeinformationen werden verwendet, um Sie bei der Verwendung anderer Funktionen im Netzwerk zu überprüfen.

Browsers machen das auch

Chrome, Internet Explorer und Firefox führen ebenfalls eine Variation davon durch. Wenn Sie sich auf einer Website anmelden müssen und der Server @ unterstütVerhandlunautorisierung, der Server sendet Ihnen einen Hinweis zurück, dass Sie die Windows / Domain / Kerberos-Anmeldeinformationen des Benutzers testen sollten:

HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
Date: Thu, 09 Jul 2015 14:35:58 GMT
Content-Length: 0

Chrome nimmt dann Ihr zwischengespeichert credentials und leiten sie (nach etwas Zwischenmagie) an den Webserver weiter:

GET http://hr.woodglue.com HTTP/1.1
Host: hr.woodglue.com
Authorization: Negotiate YIIFzwYGKwYBBQUCoIIFwzCCBb....

Microsoft spricht über diesen Mechanismus in Internet Explorer im alten Artikel:

HTTP-basierte plattformübergreifende Authentifizierung mithilfe des Verhandlungsprotokolls

Der Kunde ruft anAcquireCredentialsHandle() undInitializeSecurityContext() mit dem SPN, um den Sicherheitskontext zu erstellen, der das Sitzungsticket vom TGS / KDC anfordert.Sie validieren anhand einer Domain, nicht anhand von Servern

Abschließend möchte ich erwähnen, dass Server, Webserver, Workstations und Dateiserver keine Berechtigungsnachweise gegen ein @ validiereServe, sie validieren gegen eine DomainRegle. Du hast ein nebulösesWal von vielen Domain-Servern und einer von ihnen bearbeitet Ihre Anfrage.

it anderen Worten, Sie überprüfen Ihre Anmeldeinformationen nicht anhand von:

\\uranium (ein Domänencontroller auf demwoodglue.com domain)

Sie überprüfen Ihre Anmeldeinformationen anhand von:

daswoodglue.com domain

Wir haben das wichtige Konzept, dass jemand:

validiere dein zwischengespeichert Referenzegegen eine Domainohne einen Benutzernamen oder ein Passwort eingeben zu müssenWie kann ich das machen

Wie kann ich die zwischengespeicherten Anmeldeinformationen einer Person überprüfen? Wie kannI:

validiere das @ des Benutze zwischengespeichert Referenzeegen einDomaiohn der Benutzer muss einen Benutzernamen oder ein Passwort eingeben (d. h. mit den zwischengespeicherten Windows-Anmeldeinformationen)

Der wichtige Punkt ist, dass man es nicht weiß (oder sich darum kümmert):

wenn der Computer des Benutzers einer Domäne angehörtwenn der Computer des Benutzers einer Arbeitsgruppe angehörtwenn der Computer des Benutzers mit dem @ verbunden iwoodglue.com oder eine andere Domain (z. B.superglue.com) die Namen der Server, die das @ mit Strom versorgsuperglue.com domain

Ich weiß nicht, wie es geht.
Ich weiß nicht, um welche API-Technologien es sich handelt.

Ich weiß, es gibt eine API namensSecurity Support Provider-Schnittstelle (SSPI). Das ist was powersWWW-Authenticate: Negotiate (obwohl ich nicht weiß, ob es das ist, was SMB von einem nicht domänenverbundenen PC antreibt).

Chromiums Open-Source kann uns möglicherweise mit einem Snippet aus ihrem @ startehttp_auth_sspi_win.cc. Sie verwenden die SSPI-FunktionAcquireCredentialsHandle:

int AcquireDefaultCredentials(CredHandle* cred) 
{
   TimeStamp expiry;
   // Pass the username/password to get the credentials handle.
   // Note: Since the 5th argument is NULL, it uses the default
   // cached credentials for the logged in user, which can be used
   // for a single sign-on.
   SECURITY_STATUS status = library->AcquireCredentialsHandle(
         NULL,  // pszPrincipal
         const_cast<SEC_WCHAR*>(package),  // pszPackage
         SECPKG_CRED_OUTBOUND,  // fCredentialUse
         NULL,  // pvLogonID
         NULL,  // pAuthData
         NULL,  // pGetKeyFn (not used)
         NULL,  // pvGetKeyArgument (not used)
         cred,  // phCredential
         &expiry);  // ptsExpiry
}

Geben Sie den Benutzernamen und das Kennwort ein, um die Anmeldeinformationen zu bearbeiten.

Hinweis Da das 5. Argument NULL ist, werden die zwischengespeicherten Standardanmeldeinformationen für den angemeldeten Benutzer verwendet, die für eine einmalige Anmeldung verwendet werden können.

Dies "outbound" AufrufAcquireCredentialsHandle wird gefolgt von einem Anruf anInitializeSecurityContext. Die Idee ist, dassInitializeSecurityContext generiert einen undurchsichtigen Blob, der den Client darstellt.

Sie können dann eine Reihe von parallelen Anrufen durchführen:

"eingehende" AufrufAcquireCredentialsHandleAnrufAcceptSecurityContext, Weitergabe des zuvor von @ zurückgegebenen BloInitializeSecurityContext

Tostehle rehostDaniel Doubrovkines ausgezeichnetes Image:

Hinwei: In diesem Fall"Klient" und"Server" bezeichnet den Kontext von Produzent und Konsument. In meinem Fall das"Klient" und"Server" befinden sich auf demselben Computer.

Aber diese Zeile von "zeigt Forschungsaufwand" fällt auseinander, weil ich nirgends in @ seInitializeSecurityContext wo kann ich @ angebwoodglue.com als zu überprüfende Domain.

Ich weiß dasInitializeSecurityContext kontaktiert einen Kerberos-Server und erhält ein"Fahrkarte" blob. Dieser Ticket-Blob wird dann über @ an den "Server" übergebeAcceptSecurityContext. Manchmal kann der Blob über ein Netzwerk übertragen werden. in meinem Fall wird es im Speicher auf demselben Computer herumgereicht.

Aber ich sehe nicht, wie ich den Domain-Server angeben soll, mit dem er Kontakt aufnehmen sollzu das Ticket.

Nicht zu implizieren, dass SSPI überhaupt nützlich ist, um mein Problem zu lösen. Es ist nur "Forschungsaufwand".

Older Research EffortWelcher TargetName soll beim Aufrufen von InitializeSecurityContext (Negotiate) verwendet werden?Wie werden Domänenanmeldeinformationen (aus dem systemeigenen Code) überprüft?Validieren Sie das Passwort eines Benutzers mit dem Hash? Win32: Validieren von Anmeldeinformationen für Active DirectoWie wird die Windows-Authentifizierung durchgeführt?

Natürlich müsste ich währenddessen, wenn die zwischengespeicherten Anmeldeinformationen in der angegebenen Domäne nicht gültig sind, den Benutzer zur Eingabe eines Benutzernamens und eines Kennworts auffordern. Aber Benutzernamen und Passwörter sind böse, der Fluch des Rechnens, und ich möchte sie vermeiden.

Ich verwende nativen Code. nicht C#

Antworten auf die Frage(0)

Ihre Antwort auf die Frage