繁体   English   中英

为什么 User.Identity.GetUserId<int> () 在 WebApi 控制器中,除了操作方法外,其他地方都返回 0?

[英]Why does User.Identity.GetUserId<int>() in WebApi Controller return 0 everywhere except in action methods?

我正在使用 Asp.Net.Identity v2(将 AspNetUser 修改为使用 int ID)处理 WebApi 项目。 我想通过为我所有的 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吗?

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

您无法在授权前访问User.Identity 请参阅此处MSDN上的APIController 生命周期

该信息在构造函数或Initialize()尚不可用。

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

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 ... 
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM