2008-12-09 8 views
14

Ich muss den Benutzernamen mit C# programmatisch finden. Insbesondere möchte ich den System-/Netzwerkbenutzer an den aktuellen Prozess anhängen. Ich schreibe eine Webanwendung, die Windows integrierte Sicherheit verwendet.Wie finden Sie den Benutzernamen/Identität in C#

+0

Ihre Frage zu vage ist. Versuchen Sie, eine SQL-Abfrage zu schreiben? Verwenden Sie eine API? Informationen aus Active Directory abrufen? Bitte erklären Sie _exactly_, was Sie erreichen möchten. – Juliet

+0

Sorry, ich bearbeite die Frage, um genauer zu sein. – minty

Antwort

16

Hängt vom Kontext der Anwendung ab. Sie können Environment.UserName (Konsole) oder HttpContext.Current.User.Identity.Name (Web) verwenden. Beachten Sie, dass Sie bei Verwendung der integrierten Windows-Authentifizierung möglicherweise die Domäne aus dem Benutzernamen entfernen müssen. Außerdem können Sie den aktuellen Benutzer mithilfe der Benutzereigenschaft der Seite in Codebehind abrufen, anstatt ihn aus dem aktuellen HTTP-Kontext zu referenzieren.

33

Die abstrahierte Darstellung der Identität ist oft die IPrincipal/IIdentity:

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

Dies ist der gleiche Code ermöglicht es in vielen verschiedenen Modellen (winform, asp.net, wcf, etc.) zu arbeiten - aber es stützt sich auf Die Identität wird im Voraus festgelegt (da sie anwendungsdefiniert ist). Zum Beispiel in einem winform können Sie das aktuelle Benutzerfenster Identität verwenden:

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

Jedoch kann der Auftraggeber auch vollständig maßgeschneiderte sein - es muss nicht unbedingt auf Windows beziehen Konten usw. Eine andere App könnte einen Login-Bildschirm verwenden willkürlicher Benutzern zu ermöglichen, sich anzumelden:

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

Eine kleine Zugabe. In einigen Fällen möchten Sie möglicherweise einen [Standard-Principal] (https://msdn.microsoft.com/en-us/library/system.appdomain.setthreadprincipal (v = vs.110) .aspx) für Threads Ihrer Anwendung festlegen Domain. Dies kann wie folgt geschehen: 'AppDomain.CurrentDomain.SetThreadPrincipal (myPrincipal);' – Korli

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

Während dieser Codeblock die Frage beantworten könnte, wäre es am besten, wenn Sie eine Erklärung dafür liefern könnten, warum dies der Fall ist. – DavidPostill

Verwandte Themen