Comment voulez-vous faire l'emprunt d'identité dans .NET?
Est-il un simple de sortir de la boîte de façon à usurper l'identité d'un utilisateur .NET?
Jusqu'à présent, j'ai été en utilisant cette classe de code du projet pour toutes mes exigences en matière d'usurpation d'identité.
Est-il une meilleure façon de le faire en utilisant le .NET Framework?
J'ai une identification d'utilisateur à définir, (nom d'utilisateur, mot de passe, nom de domaine) qui représente l'identité j'ai besoin d'usurper l'identité d'.
- Pourriez-vous être plus précis? Il y a des tonnes de façons de faire de l'usurpation d'identité hors de la boîte.
Vous devez vous connecter pour publier un commentaire.
Voici une bonne vue d'ensemble de l' .NET de l'emprunt d'identité concepts.
Fondamentalement, vous serez en tirant parti de ces classes qui sont hors de la boîte dans la .NET framework:
Le code peut souvent obtenir de longues bien et c'est pourquoi vous voyez beaucoup d'exemples comme celui de la référence que de tenter de simplifier le processus.
"Usurpation d'identité" dans le .NET espace signifie généralement l'exécution de code sous un compte d'utilisateur spécifique. Il est un autre concept que d'obtenir l'accès à ce compte d'utilisateur via un nom d'utilisateur et le mot de passe, bien que ces deux idées paire fréquentes. Je vais les décrire à la fois, et ensuite expliquer comment utiliser mon SimpleImpersonation de la bibliothèque, qui les utilise à l'interne.
Usurpation d'identité
L'Api pour l'usurpation d'identité sont présentés .NET via le
System.Security.Principal
espace de noms:Le code le plus récent (.NET de 4,6+, .NET Core, etc.) utiliser
WindowsIdentity.RunImpersonated
, qui accepte une poignée pour le jeton de l'utilisateur de compte, et puis unAction
ouFunc<T>
pour le code à exécuter.ou
Vieux code utilisé le
WindowsIdentity.Usurper l'identité d'
méthode pour récupérer unWindowsImpersonationContext
objet. Cet objet implémenteIDisposable
, donc, en général, devrait être appelé à partir d'unusing
bloc.Alors que cette API existe encore dans .NET Framework, il doit généralement être évitée, et n'est pas disponible dans .NET de Base ou .NET Standard.
Accès à son Compte Utilisateur
L'API pour l'utilisation d'un nom d'utilisateur et mot de passe pour accéder à un compte d'utilisateur dans Windows est
LogonUser
- ce qui est Win32 API native. Il n'y a pas actuellement construit .NET API pour l'appelant, et l'on doit donc recourir à des P/Invoke.C'est l'appel de base définition, cependant, il ya beaucoup plus à considérer de fait, l'aide à la production:
SecureString
quand vous pouvez vous recueillir en toute sécurité par l'intermédiaire de touches.La quantité de code à écrire pour illustrer tout cela est au-delà de ce qui devrait être dans un StackOverflow réponse, à mon humble avis.
Un Combiné et plus Facile
Au lieu d'écrire tout cela vous-même, pensez à utiliser mon SimpleImpersonation de la bibliothèque, qui combine l'usurpation d'identité et l'accès des utilisateurs en une seule API. Il fonctionne bien à la fois modernes et anciennes bases de code, avec la même API simple:
ou
Noter qu'il est très similaire à la
WindowsIdentity.RunImpersonated
API, mais ne l'exige pas que vous savez rien à propos de jeton de poignées.C'est l'API de la version 3.0.0. Voir le projet readme pour plus de détails. Notez également qu'une version précédente de la bibliothèque utilisé une API avec le
IDisposable
modèle, similaire àWindowsIdentity.Impersonate
. La nouvelle version est beaucoup plus sûr, et les deux sont encore utilisés à l'interne.WindowsIdentity.Impersonate()
, comme je l'explique ici: stackoverflow.com/questions/22427500/.... Des idées? Merci.System.Diagnostics.Debug.Print(Environment.UserName)
de l'intérieur de lausing (new Impersonation("MyDomain", "MyUser", "MyPassword"))
bloc, il affiche le nom de l'utilisateur connecté à la place de l'identité de l'utilisateur. D'autres choses fonctionnent comme prévu à partir de l'intérieur de ce bloc (par ex. réseau d'accès à une ressource que l'utilisateur connecté n'a pas accès, mais l'identité de l'utilisateur n').LOGON32_LOGON_NEW_CREDENTIALS
. Vous pouvez essayer un des autres types de connexion. Aussi, c'est plus propre si vous utilisez mon package nuget référencé dans la mise à jour.LogonUser
. Vous pouvez avoir besoin de spécifier un type d'ouverture de session. msdn.microsoft.com/en-us/library/windows/desktop/aa378184.aspxUndo
être appelé lors de l'élimination.C'est probablement ce que vous voulez:
Mais j'ai vraiment besoin de plus de détails pour vous aider. Vous pourriez faire de l'usurpation d'identité avec un fichier de config (si vous essayez de le faire sur un site web), ou par le biais de la méthode de décorateurs (attributs) dans le cas d'un service WCF, ou par le biais... vous voyez l'idée.
Aussi, si nous parlons d'usurper l'identité d'un client qui a appelé à un service particulier (ou application web), vous devez configurer correctement le client afin qu'il passe les tokens.
Enfin, si ce que vous voulez vraiment faire est de Délégation, vous devez également le programme d'installation AD correctement de sorte que les utilisateurs et les machines sont approuvé pour la délégation.
Edit:
Jetez un oeil ici pour voir comment emprunter l'identité d'un autre utilisateur, et pour plus de documentation.
Voici mon vb.net port de Matt Johnson réponse. J'ai ajouté un enum pour les types de connexion.
LOGON32_LOGON_INTERACTIVE
a été la première valeur d'enum qui a travaillé pour sql server. Ma chaîne de connexion était juste de confiance. Pas de nom d'utilisateur /mot de passe dans la chaîne de connexion.Vous devez Utiliser avec un
Using
déclaration à contenir du code à exécuter avec emprunt d'identité.Afficher plus de détails de ma précédente réponse
J'ai créé un package nuget
Nuget
Code sur Github
exemple : vous pouvez utiliser :
Affichage le code complet :
Je suis conscient que je suis très en retard pour la fête, mais je considère que la bibliothèque de Phillip Allan-Harding, c'est le meilleur choix pour ce cas et d'autres semblables.
Vous avez seulement besoin d'un petit morceau de code comme celui-ci:
Et ajouter sa classe:
.NET (C#), l'usurpation d'identité avec les informations d'Identification Réseau
Mon exemple peut être utilisé si vous avez besoin de l'identité de l'ouverture de session pour avoir des informations d'identification réseau, mais il a plus d'options.
Vous pouvez utiliser cette solution. (Utilisation de package nuget)
Le code source est disponible sur : Github:
https://github.com/michelcedric/UserImpersonation
Plus de détails
https://michelcedric.wordpress.com/2015/09/03/usurpation-didentite-dun-user-c-user-impersonation/