ASP.NET Web API在控制器构造函数中获取用户标识

时间:2016-04-01 09:31:38

标签: asp.net .net asp.net-web-api

最好在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?

2 个答案:

答案 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)。 如您所见,授权是请求管道中的早期步骤。 控制器创建是最新阶段。