Gibt es eine einfache Möglichkeit, sich als Benutzer in .NET auszugeben?
Bisher habe ich diese Klasse aus dem Code-Projekt für alle meine Identitätswechselanforderungen verwendet.
Gibt es eine bessere Möglichkeit, dies mit .NET Framework zu tun?
Ich habe einen Benutzeranmeldeinformationssatz (Benutzername, Kennwort, Domänenname), der die Identität darstellt, die ich zum Identitätswechsel benötige.
c#
.net
impersonation
Ashwnacharya
quelle
quelle
Antworten:
Hier finden Sie eine gute Übersicht über .NET-Identitätswechselkonzepte.
Grundsätzlich nutzen Sie diese Klassen, die im .NET Framework standardmäßig enthalten sind:
Der Code kann jedoch oft langwierig werden, und deshalb sehen Sie viele Beispiele wie das, auf das Sie verweisen, um den Prozess zu vereinfachen.
quelle
"Identitätswechsel" im .NET-Bereich bedeutet im Allgemeinen, dass Code unter einem bestimmten Benutzerkonto ausgeführt wird. Es ist ein etwas anderes Konzept, als über einen Benutzernamen und ein Passwort auf dieses Benutzerkonto zuzugreifen, obwohl diese beiden Ideen häufig zusammenpassen. Ich werde sie beide beschreiben und dann erklären, wie ich meine SimpleImpersonation- Bibliothek verwende, die sie intern verwendet.
Identitätswechsel
Die APIs für den Identitätswechsel werden in .NET über den
System.Security.Principal
Namespace bereitgestellt :Im Allgemeinen sollte neuerer Code (.NET 4.6+, .NET Core usw.) verwendet werden
WindowsIdentity.RunImpersonated
, der ein Handle für das Token des Benutzerkontos akzeptiert und dann entweder einAction
oderFunc<T>
für die Ausführung des Codes.oder
Älterer Code verwendete die
WindowsIdentity.Impersonate
Methode zum Abrufen einesWindowsImpersonationContext
Objekts. Dieses Objekt wird implementiertIDisposable
und sollte daher im Allgemeinen von einemusing
Block aus aufgerufen werden .Diese API ist zwar noch in .NET Framework vorhanden, sollte jedoch generell vermieden werden und ist in .NET Core oder .NET Standard nicht verfügbar.
Zugriff auf das Benutzerkonto
Die API für die Verwendung eines Benutzernamens und eines Kennworts für den Zugriff auf ein Benutzerkonto in Windows lautet
LogonUser
- eine native Win32-API. Derzeit gibt es keine integrierte .NET-API zum Aufrufen, daher muss auf P / Invoke zurückgegriffen werden.Dies ist die grundlegende Anrufdefinition, es gibt jedoch noch viel mehr zu beachten, um sie tatsächlich in der Produktion zu verwenden:
SecureString
wenn Sie einen sicher über Benutzertastenanschläge sammeln können.Die Menge an Code, die geschrieben werden muss, um all dies zu veranschaulichen, übersteigt IMHO die Anforderungen einer StackOverflow-Antwort.
Ein kombinierter und einfacherer Ansatz
Anstatt all dies selbst zu schreiben, sollten Sie meine SimpleImpersonation- Bibliothek verwenden, die Identitätswechsel und Benutzerzugriff in einer einzigen API kombiniert. Es funktioniert sowohl in modernen als auch in älteren Codebasen mit derselben einfachen API:
oder
Beachten Sie, dass es der
WindowsIdentity.RunImpersonated
API sehr ähnlich ist , jedoch keine Kenntnisse über Token-Handles erfordert.Dies ist die API ab Version 3.0.0. Weitere Informationen finden Sie in der Projekt-Readme-Datei. Beachten Sie auch, dass eine frühere Version der Bibliothek eine API mit dem
IDisposable
Muster verwendet hat, ähnlich wieWindowsIdentity.Impersonate
. Die neuere Version ist viel sicherer und beide werden weiterhin intern verwendet.quelle
Undo
dass er während der Entsorgung aufgerufen wird.Dies ist wahrscheinlich, was Sie wollen:
Aber ich brauche wirklich mehr Details, um Ihnen zu helfen. Sie können sich mit einer Konfigurationsdatei ausgeben (wenn Sie dies auf einer Website versuchen) oder über Methodendekoratoren (Attribute), wenn es sich um einen WCF-Dienst handelt, oder über ... Sie haben die Idee.
Wenn Sie sich als Client ausgeben, der einen bestimmten Dienst (oder eine bestimmte Web-App) aufgerufen hat, müssen Sie den Client korrekt konfigurieren, damit er die entsprechenden Token übergibt.
Wenn Sie wirklich delegieren möchten, müssen Sie AD auch korrekt einrichten, damit Benutzer und Computer für die Delegierung vertrauenswürdig sind.
Bearbeiten:
Sehen Sie sich hier an, wie Sie sich als ein anderer Benutzer ausgeben können, und erhalten Sie weitere Dokumentation.
quelle
Hier ist mein vb.net-Port von Matt Johnsons Antwort. Ich habe eine Aufzählung für die Anmeldetypen hinzugefügt.
LOGON32_LOGON_INTERACTIVE
war der erste Enum-Wert, der für SQL Server funktioniert hat. Meine Verbindungszeichenfolge wurde nur als vertrauenswürdig eingestuft. Kein Benutzername / Passwort in der Verbindungszeichenfolge.Sie müssen mit einer
Using
Anweisung verwenden, um Code zu enthalten, der als Identitätswechsel ausgeführt werden soll.quelle
Weitere Details aus meiner vorherigen Antwort anzeigen Ich habe ein Nuget-Paket Nuget erstellt
Code auf Github
Beispiel: Sie können verwenden:
Sehen Sie sich den vollständigen Code an:
quelle
Ich bin mir bewusst, dass ich ziemlich spät zur Party komme, aber ich denke, dass die Bibliothek von Phillip Allan-Harding die beste für diesen Fall und ähnliche ist.
Sie benötigen nur einen kleinen Code wie diesen:
Und füge seine Klasse hinzu:
.NET (C #) Identitätswechsel mit Netzwerkanmeldeinformationen
Mein Beispiel kann verwendet werden, wenn für die imitierte Anmeldung Netzwerkanmeldeinformationen erforderlich sind, es jedoch mehr Optionen gibt.
quelle
Sie können diese Lösung verwenden. (Nuget-Paket verwenden) Der Quellcode ist verfügbar unter: Github: https://github.com/michelcedric/UserImpersonation
Weitere Details https://michelcedric.wordpress.com/2015/09/03/usurpation-didentite-dun-user-c-user-impersonation/
quelle