在 ASP.NET Web API Controller 构造函数中获取用户身份是个好主意,例如:
public PagesController(PageValidator pageValidator, PageMapper pageMapper, PagesManager pagesManager, UsersManager usersManager)
:base(usersManager)
{
_pageValidator = pageValidator;
_pageMapper = pageMapper;
_pagesManager = pagesManager;
if (User.Identity.IsAuthenticated)
_pagesManager.UserId = usersManager.GetByEmail(User.Identity.Name).Id;
}
在此调用引发之前,User.Identity 是否始终正确填充?
最佳答案
这已经咬了我好几次了。根据您执行身份验证的位置/方式,您需要小心访问身份的位置,特别是在 Controller 构造函数中。
例如,在IAuthenticationFilter
之后调用 Controller 操作实例化后, Controller 的构造函数被调用before AuthenticateAsync
;意味着您在 AuthenticateAsync
中进行的任何身份验证在 Controller 的构造函数中不可用(如您的示例中)。
我通常不依赖 Controller 构建期间可用的东西(除非由 DI 处理)。相反,您可以根据需要在 Controller 操作中访问身份。
如果您希望使身份查找更容易(即根据 User.Identity.Name
属性拉入您的用户对象),请创建一个基本 Controller 类,该类具有为您执行此操作的属性或方法,然后让您的 Controller 继承自那...
public User AuthenticatedUser
{
get
{
if (User.Identity.IsAuthenticated)
{
return usersManager.GetByEmail(User.Identity.Name);
}
return null;
}
}
编辑
参见here有关 Web.API 生命周期的详分割解,显示在身份验证之前发生的 Controller 创建。
关于ASP.NET Web API 在 Controller 构造函数中获取用户身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36352752/