我正在使用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
答案 0 :(得分:1)
授权前无法访问gfortran file_name.f90 -lblas -o file_name.e
。请参阅APIController life cycle here或MSDN。
构造函数或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 ...
}
}