Dies sollte nicht versucht werden, bis es in der Entwicklung genau so konfiguriert und getestet wurde, wie es in der Produktion sein wird. Die Verwendung der Windows-Authentifizierung und des Identitätswechsels mit IIS und benutzerdefinierten Anwendungen kann sehr komplex sein. Selbst wenn es auf magische Weise in der Produktion funktionieren würde, ohne eine Entwicklungsumgebung zu haben, die die Produktion genau widerspiegelt, wären Sie völlig verloren, wenn Sie ein Problem untersuchen müssten.
SPN
Wenn ein SPN erstellt wird, ist es üblich, einen SPN sowohl für den fqdn als auch für den Kurznamen zu erstellen. Beispiel:
setspn.exe -A http/computer
setspn.exe -A http/computer.domain.com
Es wird empfohlen, dass diese mit dem Namen vor Windows 2000 (NetBIOS-Name) und dem DNS-Namen übereinstimmen, der beim Herstellen einer Verbindung zum Dienst verwendet wird. Wenn keiner dieser Namen der Name ist, der für die Verbindung zum Dienst verwendet wird, sollte auch für diesen Namen ein SPN vorhanden sein.
Doppelte SPNs, die für denselben Dienst / Namen auf verschiedenen Konten / Computern registriert sind, sind eine häufige Ursache dafür, dass die Kerberos-Delegierung nicht funktioniert. Mit Setspn können Sie gerne doppelte SPNs erstellen. Microsoft hat einen Hotfix herausgegeben, der dieses Verhalten korrigiert:
Ein doppelter SPN wird registriert, wenn Sie den Befehl setspn zusammen mit dem Schalter -a in Windows 7 oder Windows Server 2008 R2 https://support.microsoft.com/kb/2717045 ausführen
Der Zielcomputer, auf dem sich der Dienst befindet, benötigt den SPN.
HTTP/computername.company.com
HTTP/computername
Für die Delegation vertrauenswürdig
Das Computer- oder Benutzerkonto, das den Identitätswechsel ausführt, muss als Vertrauenswürdig für die Delegierung angegeben werden. Wenn ein Benutzerkonto den Identitätswechsel ausführt, muss das Computerkonto, auf dem der Identitätswechsel durchgeführt wird, auf dieselbe Weise auch als Vertrauenswürdig für die Delegierung konfiguriert werden.
Klicken Sie unter Active Directory-Benutzer und -Computer auf dem Computer oder Benutzerkonto auf die Registerkarte Delegierung. (Benutzerkonten zeigen die Registerkarte "Delegierung" nur an, wenn sie über einen SPN verfügt. Möglicherweise muss dem Benutzerkonto ein SPN wie RPC / Benutzername zugewiesen werden, damit die Registerkarte "Delegierung" angezeigt wird.)
Wählen Sie auf der Registerkarte "Delegierung" die Option "Diesem Benutzer / Computer für die Delegierung an einen Dienst vertrauen (nur Kerberos)" für eine uneingeschränkte Delegierung aus.
Wählen Sie unter Eingeschränkte Delegierung die Option "Diesem Benutzer / Computer nur für die Delegierung an bestimmte Dienste vertrauen" aus. Wählen Sie "Beliebiges Authentifizierungsprotokoll verwenden". Sie können auf Hinzufügen klicken und zu dem Computer navigieren, auf dem die Service-SPNs angekündigt werden, und diese hinzufügen. Beachten Sie, dass diese nicht als SPNs angezeigt werden, wenn Sie setspn.exe -L domain \ useraccount ausführen.
Delegierungsmodell
Sie müssen bestimmen, welches Delegierungsmodell verwendet werden soll. Diese Entscheidung kann aus Sicherheitsgründen erzwungen werden.
Unbeschränkt ermöglicht es einem Computer oder Dienstkonto, sich als Benutzer auszugeben. Dies ist äußerst leistungsfähig und wurde von vielen Organisationen vermieden.
Die eingeschränkte Delegierung beschränkt die Identitätswechselaktivität auf bestimmte Zielcomputer und -dienste (HTTP, CIFS, ...), mit denen ein Dienstkonto, das einen Identitätswechsel durchführt, möglicherweise eine Verbindung herstellen kann. Es bietet außerdem den zusätzlichen Komfort, dass es den Identitätswechsel eines Kontos ermöglicht, ohne über die Anmeldeinformationen des Kontos oder ein bereits vorhandenes Windows / Kerberos-Sicherheitstoken zu verfügen .
Mehrere Domänen
Die eingeschränkte Delegierung funktioniert nicht, wenn sich die FE / BE-Server in verschiedenen Domänen befinden.
Bei der eingeschränkten Delegierung muss sich das Konto / der Computer, der den Identitätswechsel ausführt, in derselben Domäne wie die Zielressource / der Zieldienst befinden. Diese Domäne ist normalerweise die "Ressourcendomäne". Die Konten, die sich als solche ausgeben, können sich in einer vertrauenswürdigen Domäne befinden, einschließlich vertrauenswürdiger Domänen in anderen Gesamtstrukturen.
Höhere Privilegien
Das Benutzerkonto, das den Identitätswechsel durchführt, muss das SetTCB-Privileg (als Teil des Betriebssystems fungieren) auf dem Computer besitzen, auf dem der Code ausgeführt wird, der den Identitätswechsel ausführt. Beachten Sie, dass unter Windows Vista / 7/2008 die SetTCB-Berechtigung möglicherweise nur von Prozessen mit einer hohen Integritätsstufe gehalten wird. Daher muss das Konto möglicherweise der lokalen Administratorgruppe hinzugefügt werden.
Die Identität der autorisierten Benutzer muss Mitglied der lokalen Benutzergruppe auf dem Computer sein, auf dem der Identitätswechsel durchgeführt wird.
Als Teil des Betriebssystems fungieren kann mit gpedit.msc oder gpmc.msc zugewiesen werden. Es befindet sich unter Computer> Windows-Einstellungen> Sicherheitseinstellungen> Lokale Richtlinien> Zuweisung von Benutzerrechten.
Funktionsweise des Kerberos Version 5-Authentifizierungsprotokolls
http://technet.microsoft.com/en-us/library/cc772815%28WS.10%29.aspx
- Wenn die Option Nur Kerberos verwenden ausgewählt ist, verwendet das Konto eine eingeschränkte Delegierung ohne Protokollübergang.
- Wenn die Option Authentifizierungsprotokoll verwenden ausgewählt ist, verwendet das Konto eine eingeschränkte Delegierung mit Protokollübergang.
Wütend! Nachdem Sie alles richtig konfiguriert haben, können Sie alles zu einem einfachen Testfall zusammenfassen, der leicht zu beheben ist. Angenommen, Sie haben einen SPN für CIFS \ fileserver.company.com erstellt und möchten sich als anotherUser@trustedDomain.company.com ausgeben und auf eine Freigabe auf diesem Server zugreifen:
// no password required with constrained delegation
using (WindowsIdentity id = new WindowsIdentity("anotherUser@trustedDomain.company.com"))
using (WindowsImpersonationContext wic = id.Impersonate())
{
// ImpersonationLevel will be "Impersonation" when constrained delegation is setup correctly
// It will be "Identification" if the account performing impersonation does not have SetTCB privilege
Debug.WriteLine("ImpersonationLevel: " + id.ImpersonationLevel);
// Authentication type should be "Kerberos"
Debug.WriteLine("AuthenticationType: " + id.AuthenticationType);
Debug.WriteLine("Username: " + WindowsIdentity.GetCurrent().Name);
Debug.WriteLine("Groups:");
foreach (IdentityReference identity in id.Groups)
{
NTAccount ntaccount = identity.Translate(typeof (NTAccount)) as NTAccount;
Debug.WriteLine("Account: " + ntaccount.Value + " SID: " + identity.Value);
}
// This will fail with access denied if constrained delegation is not setup properly.
// On the target server/resource, if it fails it may show an attempt to logon using anonymous
string[] fileNames = Directory.GetFiles(@"\\fileserver.company.com\ShareName");
foreach (string fileName in fileNames)
{
Console.WriteLine(fileName);
}
}