如何获取Windows用户名

本文关键字:Windows 用户 获取 何获取 | 更新日期: 2023-09-27 18:12:03

我创建了带有windows身份验证的asp.net core应用程序。我在_Layout.cshtml中看到以下行:

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

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

如何获取Windows用户名

如果你的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; }
    }
}

获取当前用户可以使用

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

不建议以这种方式包含用户名,因为它取决于当前的HTTP上下文,所以如果你试图对控制器进行单元测试,它总是会失败,因为没有HTTP上下文。

你必须在接口中抽象它并注入实现。例:

 public interface ICurrentUserService
    {
        string LogingName { get; }
    }

在你的web项目中,你像这样实现这个接口

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

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