如何获取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#,我如何在控制器代码中获得相同的值?应该引用哪些名称空间?
如果你的TestController
继承自Controller
。User.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
,在您的测试用例中,您可以模拟它以返回固定的用户名