最好在ASP.NET Web API控制器构造函数中获取用户身份,例如:
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?
答案 0 :(得分:2)
这让我咬了几次。根据您执行身份验证的位置/方式,您需要注意访问身份的位置,特别是在控制器构造函数中。
例如,虽然在实例化IAuthenticationFilter
之后调用控制器操作,但控制器的构造函数在之前被称为 { {1}};这意味着您在AuthenticateAsync
中执行的任何身份验证都无法在控制器的构造函数中使用(如示例所示)。
我通常不依赖控制器构造期间可用的东西(除非由DI处理)。而是在控制器操作中根据需要访问身份。
如果您正在寻求简化身份查找(即根据AuthenticateAsync
属性提取用户对象),请创建一个基本控制器类,该类具有为您执行此操作的属性或方法,然后让您的控制器继承...
User.Identity.Name
修改强>
有关Web.API生命周期的详细分类,请参阅here,显示在身份验证之前发生的控制器创建。
答案 1 :(得分:1)
是。您可以在Controller中的任何位置使用此属性。 ASP.NET有请求管道:(http://www.dotnetcurry.com/aspnet/888/aspnet-webapi-message-lifecycle)。 如您所见,授权是请求管道中的早期步骤。 控制器创建是最新阶段。