我将我的ASP.NET 4应用程序迁移到ASP.NET Core。我的API中的大多数方法都可以正常工作,但奇怪的是有些方法没有,我看不出任何理由。
我正在使用Owin.OAuth身份验证(OAuthAuthorizationServerProvider
),除了两次调用之外,其他所有调用都正确填充this.User
(来自ControllerBase
)属性。对于两个控制器,这不起作用!
所以这个控制器工作,更具体地说是在构造点.User是非null并且包含正确的Bearer令牌用户。
[Authorize]
public class DriversController : AuthenticatedController
{
public DriversController() : base()
{
// this.User is none null!
}
[HttpGet]
[Route("api/drivers")]
public async Task<IActionResult> GetDrivers()
{
...
}
}
此控制器不起作用,当命中构造函数时,this.User
为空
[Authorize]
public class DriversAssignmentController : AuthenticatedController
{
public DriversAssignmentController() : base()
{
// this.User is null!
}
[HttpGet]
[Route("api/driverassignment")]
public async Task<IActionResult> GetDriversAssignments()
{
...
}
}
请注意,this.User
是Microsoft.AspNetCore.Mvc.ControllerBase
上AuthenticatedController
继承的属性。
答案 0 :(得分:4)
您无法从构造函数访问User
,因为它依赖于ControllerContext
属性,该属性在调用构造函数后由ASP.NET Core MVC初始化。
理想情况下,请考虑重构代码,以便它不会尝试从构造函数中访问依赖于请求的属性,例如User
。
如果您真的不能重构它,请考虑将IHttpContextAccessor
导入为构造函数依赖项:
public DriversController(IHttpContextAccessor accessor)
{
var user = accessor.HttpContext.User;
}