如何获取Windows用户名?

时间:2016-10-08 05:38:34

标签: c# asp.net-core .net-core

我使用Windows身份验证创建了asp.net核心应用程序。我在_Layout.cshtml中看到了以下行:

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

它指的是Microsoft.AspnetCore.Mvc.Razor.RazorPage.User属性,它似乎只能在Razor模板中访问。使用C#,如何在控制器代码中获得相同的值?应该引用哪些名称空间?

3 个答案:

答案 0 :(得分:2)

如果您的TestController继承自ControllerUser.Identity.Name就够了。在其他情况下,它位于

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 :(得分:1)

要获得当前用户,您可以使用此

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

答案 2 :(得分:-1)

不建议以这种方式包含用户名,因为它取决于当前的HTTP上下文,因此如果您尝试对控制器进行单元测试,它将始终失败,因为没有HTTP上下文。

您必须在界面中抽象它并注入实现。 例如:

 public interface ICurrentUserService
    {
        string LogingName { get; }
    }

在您的网络项目中,您可以像这样实现此界面

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

在您的控制器类中,您将注入类型ICurrentUserService的参数,并使用任何depdnency注入框架注入CurrentUserService,在您的测试用例中,您可以模拟它以返回固定的用户名