Wechseln und Zurücksetzen der Identität
Aktualisiert: November 2007
In einigen Fällen müssen Sie ein Windows NT-Kontotoken abrufen, um die Identität eines Windows-Kontos anzunehmen. So muss die ASP.NET-basierte Anwendung ggf. zu unterschiedlichen Zeiten die Identität verschiedener Benutzer annehmen. Die Anwendung kann hierzu ein Token, das einen Administrator darstellt, von Internetinformationsdienste (IIS) akzeptieren, diese Benutzeridentität annehmen, eine Operation ausführen und die Identität anschließend wieder zurücksetzen. Anschließend kann diese ein weiteres Token von IIS akzeptieren, das einen Benutzer mit weniger Rechten darstellt, Operationen ausführen und die Identität erneut zurücksetzen.
In Fällen, in denen die Anwendung die Identität eines Windows-Kontos annehmen muss, das von IIS nicht an den aktuellen Thread angefügt wurde, müssen Sie das Token des Kontos abrufen und mit diesem das Konto aktivieren. Führen Sie dafür die folgenden Schritte aus:
Rufen Sie ein Kontotoken für einen bestimmten Benutzer ab, indem Sie die nicht verwaltete LogonUser-Methode aufrufen. Diese Methode befindet sich nicht in der .NET Framework-Basisklassenbibliothek, sondern in der nicht verwalteten advapi32.dll. Der Zugriff auf Methoden in nicht verwaltetem Code ist eine erweiterte Operation und wird hier nicht näher beschrieben. Weitere Informationen finden Sie unter Interoperation mit nicht verwaltetem Code. Weitere Informationen zur LogonUser-Methode und advapi32.dll finden Sie in der Platform SDK-Dokumentation.
Erstellen Sie eine neue Instanz der WindowsIdentity-Klasse, und übergeben Sie hierbei das Token. Der folgende Code veranschaulicht diesen Aufruf. hToken stellt hierbei ein Windows-Token dar.
WindowsIdentity ImpersonatedIdentity = new WindowsIdentity(hToken);
Dim ImpersonatedIdentity As New WindowsIdentity(hToken)
Beginnen Sie mit dem Identitätswechsel, indem Sie eine neue Instanz der WindowsImpersonationContext-Klasse erzeugen und diese, wie im folgenden Code dargestellt, mit der WindowsIdentity.Impersonate-Methode der initialisierten Klasse initialisieren.
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate();
WindowsImpersonationContext MyImpersonation = ImpersonatedIdentity.Impersonate()
Wenn Sie die neue Identität nicht mehr benötigen, rufen Sie die WindowsImpersonationContext.Undo-Methode auf, wie im folgenden Code dargestellt.
MyImpersonation.Undo();
MyImpersonation.Undo()
Wenn vertrauenswürdiger Code bereits ein WindowsPrincipal-Objekt an den Thread angefügt hat, können Sie die Instanzmethode Impersonate aufrufen, an die kein Kontotoken übergeben wird. Beachten Sie, dass dies nur sinnvoll ist, wenn das WindowsPrincipal-Objekt des Threads einen anderen Benutzer als den Benutzer darstellt, unter dem der Prozess derzeit ausgeführt wird. Diese Situation kann z. B. gegeben sein, wenn Sie ASP.NET mit aktivierter Windows-Authentifizierung und deaktiviertem Identitätswechsel verwenden. In diesem Fall wird der Prozess unter einem in IIS (Internet Information Services) konfigurierten Konto ausgeführt, während der aktuelle Principal den auf die Seite zugreifenden Windows-Benutzer darstellt.
Beachten Sie, dass weder Impersonate noch Undo das dem aktuellen Aufrufkontext zugeordnete Principal-Objekt ändert. Beim Annehmen einer Identität und dem anschließenden Zurücksetzen wird das Token geändert, das dem aktuellen Betriebssystemprozess zugeordnet ist.
Siehe auch
Konzepte
Principal- und Identitätsobjekte
Verwenden der IIS-Authentifizierung mit ASP.NET-Identitätswechsel