为什么WebApi Controller中的User.Identity.GetUserId <int>()除了动作方法外都返回0?

时间:2016-03-25 14:02:54

标签: c# asp.net-web-api asp.net-identity-2

我正在使用Asp.Net.Identity v2开发一个WebApi项目(修改了AspNetUser以使用int ID)。我想通过为我的所有web api控制器创建一个基类来进行一些重构。特别是,我希望MyBaseController类封装获取当前用户ID的逻辑。

以前,每个控制器中的每个操作方法都称为User.Identity.GetUserId<int>()。这很麻烦但很有效。

现在我决定将该调用封装在基类的构造函数或其属性中。但是,它不起作用:我得到的Identity对象为空(IsAuthenticated = false, Name = null...),而GetUserId<int>()始终返回0

显然,只有在Identity填充GetUserId<int>()并且public class MyBaseController : ApiController { public int UserId => User.Identity.GetUserId<int>(); // **this always returns 0** public MyBaseController() : base() { var userId = User.Identity.GetUserId<int>(); // **this is always 0** } protected override void Initialize(HttpControllerContext controllerContext) { base.Initialize(controllerContext); var userId = User.Identity.GetUserId<int>(); // **also 0** } public IHttpActionResult Get() { var userId = User.Identity.GetuserId<int>(); // **the only place where it returns userId properly** // some code ... } } 返回正确结果的操作方法中?

这基本上是我得到的:

User.Identity

有没有办法在动作方法中抓取<router-view>以在基类中执行某些操作?

该项目最初是在VS 2013中使用MVC 5 / WEbapi 2创建的,现已迁移到VS2015

2 个答案:

答案 0 :(得分:1)

授权前无法访问gfortran file_name.f90 -lblas -o file_name.e 。请参阅APIController life cycle hereMSDN

构造函数或User.Identity中尚未提供该信息。

答案 1 :(得分:0)

您可以在基本控制器中使用属性:

public abstract class MyBaseController : ApiController
{
    public int UserID
    {
        get { return User.Identity.GetUserId<int>(); }
    }
}

public class MyNormalController : MyBaseController
{
    public ActionResult Index()
    {
        var userId = UserID; // put in variable to avoid multiple calls
       // some code ... 
    }
}