2016-10-08 5 views
-1

Ich erstellte asp.net Core App mit Windows-Authentifizierung. Ich sehe die follwoing Linie in _Layout.cshtml:Wie erhält man den Windows-Benutzernamen?

<p class="nav navbar-text navbar-right">Hello, @User.Identity.Name!</p> 

Es bezieht sich auf Microsoft.AspnetCore.Mvc.Razor.RazorPage.User Eigenschaft, die nur in einer Razor Vorlage zugänglich zu sein scheint, ist. Wie kann ich mit C# den gleichen Wert in einem Controller-Code erhalten? Auf welche Namespaces sollte verwiesen werden?

Antwort

2

Wenn Ihre TestController Erbt verwenden. User.Identity.Name ist genug. In einem anderen Fall es in

namespace System.Security.Principal 
{ 
    // 
    // Summary: 
    //  Defines the basic functionality of an identity object. 
    public interface IIdentity 
    { 
     // 
     // Summary: 
     //  Gets the type of authentication used. 
     // 
     // Returns: 
     //  The type of authentication used to identify the user. 
     string AuthenticationType { get; } 
     // 
     // Summary: 
     //  Gets a value that indicates whether the user has been authenticated. 
     // 
     // Returns: 
     //  true if the user was authenticated; otherwise, false. 
     bool IsAuthenticated { get; } 
     // 
     // Summary: 
     //  Gets the name of the current user. 
     // 
     // Returns: 
     //  The name of the user on whose behalf the code is running. 
     string Name { get; } 
    } 
} 
1

Für aktuelle Benutzer bekommen können Sie dies von Controller

string userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; 
+0

zurückgeben Dies wird nicht den angemeldeten Benutzernamen erhalten, aber die Identität, die die Anwendung unter –

+0

@H läuft Aitham Shaddad Hmm lass mich nachsehen. Yep du bist richtig, mein schlechtes – mybirthname

+0

Aber der Fragetitel ist 'wie man Windows Benutzernamen erhält?'. Da es keine Möglichkeit gibt, diese Informationen vom Kunden zu bekommen, halte ich diese Antwort für ausreichend. Wie auch immer, Clients könnten auf Mac oder Linux laufen, also fehlt es offensichtlich an diesen Fragen oder denken und recherchieren, bevor sie um Hilfe bitten ... –

-1

befindet empfiehlt es nicht den Benutzernamen auf diese Weise zu schließen, wie es auf dem aktuellen HTTP-Kontext abhängig ist, so dass, wenn Sie Einheit testen Sie Ihre Controller versucht, es wird immer da fehl kein HTTP-Kontext sein.

Sie müssen es in einer Schnittstelle abstrahieren und die Implementierung injizieren. ex:

public interface ICurrentUserService 
    { 
     string LogingName { get; } 
    } 

Und in Ihrem Web-Projekt, implementieren Sie diese Schnittstelle wie diese

public class CurrentUserService : ICurrentUserService 
{ 
    public LoginName 
    { 
    get 
     { 
      return HttpContext.Current.User.Identity.Name; 
     } 
    } 
} 

In Ihrer Controller-Klasse, werden Sie einen Parameter vom Typ ICurrentUserService, injizieren und die Verwendung jeden depdnency Injektion Rahmen inject CurrentUserService, in Ihren Testfällen können Sie dann spotten, um einen festen Benutzernamen

+0

Die Frage bezieht sich auf ASP.NET Core, dort hat HttpContext keine statische Eigenschaft 'Current'. Bitte lesen Sie die Frage sorgfältig, bevor Sie antworten – Tseng

+0

@Tseng Der Zweck der Antwort ist es, den Weg zu zeigen, nicht die genaue Linie, er kann einfach ersetzen die 'HttpContext.Current.User.Identity.Name'; mit der äquivalenten Zeile von asp.net core, die bereits in vielen Antworten angegeben ist –

Verwandte Themen