ASP.NET Web API 在 Controller 构造函数中获取用户身份

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

在 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/

相关文章:

c# - 在 web.config 之外存储配置设置的最佳方式

c# - 从另一个 Controller 调用 WebApi Controller

c# - 使用 MSBuild,我可以签署一个在文件中指定密码的应用程序吗?

.net - 如何获取/计算.net中进程使用的总内存?

c# - ASP.NET 使用 SqlConnection 连接 MySQL

c# - 具有空安全性的 Web API 空列表

javascript - 如何通过 AngularJS $http 从 ASP.Net Web API 2 获取访问 token ?

c# - 我怎样才能让 Response.Redirect() 从 MasterPage 工作?

javascript - 在服务器端禁用aspxgridviews,如何在客户端处理?

c# - 从 WebApi 调用 STA COM 对象