Existe-t-il un moyen prêt à l'emploi pour emprunter l'identité d'un utilisateur dans .NET?
Jusqu'à présent, j'ai utilisé cette classe du projet de code pour toutes mes exigences d'emprunt d'identité.
Existe-t-il une meilleure façon de le faire en utilisant .NET Framework?
J'ai un ensemble d'informations d'identification utilisateur (nom d'utilisateur, mot de passe, nom de domaine) qui représente l'identité dont j'ai besoin pour emprunter l'identité.
c#
.net
impersonation
ashwnacharya
la source
la source
Réponses:
Voici un bon aperçu des concepts d'emprunt d'identité .NET.
En gros, vous tirerez parti de ces classes qui sont prêtes à l'emploi dans le framework .NET:
Cependant, le code peut souvent devenir long et c'est pourquoi vous voyez de nombreux exemples comme celui que vous référencez qui tentent de simplifier le processus.
la source
«L'emprunt d'identité» dans l'espace .NET signifie généralement exécuter du code sous un compte d'utilisateur spécifique. C'est un concept quelque peu différent de celui d'accéder à ce compte utilisateur via un nom d'utilisateur et un mot de passe, bien que ces deux idées se combinent fréquemment. Je vais les décrire tous les deux, puis expliquer comment utiliser ma bibliothèque SimpleImpersonation , qui les utilise en interne.
Imitation
Les API pour l'emprunt d'identité sont fournies dans .NET via l'
System.Security.Principal
espace de noms:Le code plus récent (.NET 4.6+, .NET Core, etc.) doit généralement utiliser
WindowsIdentity.RunImpersonated
, qui accepte un handle vers le jeton du compte d'utilisateur, puis unAction
ouFunc<T>
pour le code à exécuter.ou
Un code plus ancien utilisait la
WindowsIdentity.Impersonate
méthode pour récupérer unWindowsImpersonationContext
objet. Cet objet implémenteIDisposable
, doit donc généralement être appelé à partir d'unusing
bloc.Bien que cette API existe toujours dans .NET Framework, elle doit généralement être évitée et n'est pas disponible dans .NET Core ou .NET Standard.
Accéder au compte utilisateur
L'API permettant d'utiliser un nom d'utilisateur et un mot de passe pour accéder à un compte d'utilisateur dans Windows est
LogonUser
- qui est une API native Win32. Il n'existe actuellement aucune API .NET intégrée pour l'appeler, il faut donc recourir à P / Invoke.Ceci est la définition de base de l'appel, mais il y a beaucoup plus à considérer pour l'utiliser en production:
SecureString
quand vous pouvez en récupérer un en toute sécurité via les frappes de l'utilisateur.La quantité de code à écrire pour illustrer tout cela est au-delà de ce qui devrait être dans une réponse StackOverflow, à mon humble avis.
Une approche combinée et plus simple
Au lieu d'écrire tout cela vous-même, pensez à utiliser ma bibliothèque SimpleImpersonation , qui combine l'emprunt d'identité et l'accès utilisateur dans une seule API. Cela fonctionne bien dans les bases de code modernes et plus anciennes, avec la même API simple:
ou
Notez qu'il est très similaire à l'
WindowsIdentity.RunImpersonated
API, mais ne nécessite pas que vous sachiez quoi que ce soit sur les descripteurs de jetons.Il s'agit de l'API à partir de la version 3.0.0. Consultez le fichier Lisez-moi du projet pour plus de détails. Notez également qu'une version précédente de la bibliothèque utilisait une API avec le
IDisposable
modèle, similaire àWindowsIdentity.Impersonate
. La nouvelle version est beaucoup plus sûre et les deux sont toujours utilisées en interne.la source
Undo
est appelé pendant l'élimination.C'est probablement ce que vous voulez:
Mais j'ai vraiment besoin de plus de détails pour vous aider. Vous pouvez effectuer une usurpation d'identité avec un fichier de configuration (si vous essayez de le faire sur un site Web), ou via des décorateurs de méthode (attributs) s'il s'agit d'un service WCF, ou via ... vous avez l'idée.
De plus, si nous parlons d'emprunter l'identité d'un client qui a appelé un service particulier (ou une application Web), vous devez configurer le client correctement afin qu'il transmette les jetons appropriés.
Enfin, si vous voulez vraiment faire de la délégation, vous devez également configurer AD correctement afin que les utilisateurs et les machines soient approuvés pour la délégation.
Edit:
Jetez un œil ici pour voir comment emprunter l'identité d'un autre utilisateur et pour obtenir de la documentation supplémentaire.
la source
Voici mon port vb.net de la réponse de Matt Johnson. J'ai ajouté une énumération pour les types de connexion.
LOGON32_LOGON_INTERACTIVE
était la première valeur d'énumération qui fonctionnait pour le serveur SQL. Ma chaîne de connexion était juste approuvée. Aucun nom d'utilisateur / mot de passe dans la chaîne de connexion.Vous devez utiliser avec une
Using
instruction pour contenir du code à exécuter avec emprunt d'identité.la source
Voir plus de détails de ma réponse précédente J'ai créé un package nuget Nuget
Code sur Github
échantillon: vous pouvez utiliser:
Voir le code complet:
la source
Je sais que je suis assez en retard pour la fête, mais je considère que la bibliothèque de Phillip Allan-Harding , c'est la meilleure pour cette affaire et d'autres similaires.
Vous n'avez besoin que d'un petit morceau de code comme celui-ci:
Et ajoutez sa classe:
Emprunt d'identité .NET (C #) avec des informations d'identification réseau
Mon exemple peut être utilisé si vous avez besoin que la connexion usurpée ait des informations d'identification réseau, mais il a plus d'options.
la source
Vous pouvez utiliser cette solution. (Utilisez le 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/
la source