我使用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#,如何在控制器代码中获得相同的值?应该引用哪些名称空间?
答案 0 :(得分:2)
如果您的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; }
}
}
答案 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
,在您的测试用例中,您可以模拟它以返回固定的用户名