![](/img/trans.png)
[英]user.identity.getuserid() return user id value in web api
[英]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.