2008-12-09 18 views
14

Je dois trouver par programme le nom de l'utilisateur en utilisant C#. Plus précisément, je souhaite que l'utilisateur système/réseau soit connecté au processus en cours. J'écris une application web qui utilise la sécurité intégrée de Windows.Comment trouvez-vous le nom d'utilisateur/l'identité en C#

+0

Votre question est trop vague. Êtes-vous en train d'écrire une requête SQL? Utiliser une API? Obtenir des informations à partir d'Active Directory? S'il vous plaît expliquer _exactement_ ce que vous essayez d'accomplir. – Juliet

+0

Désolé, je modifie la question pour être plus précis. – minty

Répondre

16

Dépend du contexte de l'application. Vous pouvez utiliser Environment.UserName (console) ou HttpContext.Current.User.Identity.Name (web). Notez que lorsque vous utilisez l'authentification intégrée Windows, vous devrez peut-être supprimer le domaine du nom d'utilisateur. En outre, vous pouvez obtenir l'utilisateur actuel en utilisant la propriété User de la page dans codebehind, plutôt que de le référencer à partir du contexte HTTP actuel.

33

La vue abstraite de l'identité est souvent le IPrincipal/IIdentity:

IPrincipal principal = Thread.CurrentPrincipal; 
IIdentity identity = principal == null ? null : principal.Identity; 
string name = identity == null ? "" : identity.Name; 

Cela permet au même code de travailler dans de nombreux modèles différents (WinForm, asp.net, WCF, etc.) - mais il repose sur l'identité étant définie à l'avance (puisqu'elle est définie par l'application). Par exemple, dans un WinForm vous pouvez utiliser l'identité de l'utilisateur actuel Windows:

Thread.CurrentPrincipal = new WindowsPrincipal(WindowsIdentity.GetCurrent()); 

Cependant, le principal peut également être tout à fait sur mesure - elle ne se rapporte pas nécessairement aux fenêtres des comptes, etc. Une autre application peut utiliser un écran de connexion pour permettre aux utilisateurs de se connecter arbitraires:

string userName = "Fred"; // todo 
string[] roles = { "User", "Admin" }; // todo 
Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(userName), roles); 
+0

Une petite addition. Dans certains cas, vous pouvez définir un [principal principal] (https://msdn.microsoft.com/fr-fr/library/system.appdomain.setthreadprincipal (v = vs.110) .aspx) pour les threads de votre application domaine. Cela peut être fait comme ceci 'AppDomain.CurrentDomain.SetThreadPrincipal (myPrincipal);' – Korli

3
string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name ; 
+4

Bien que ce bloc de code puisse répondre à la question, il serait préférable que vous fournissiez des explications pour expliquer pourquoi. – DavidPostill