2

我们使用自定义策略来检查一些数据库要求(数据库中持久化的令牌),并且我需要会话信息,因此我注入了 IHttpContextAccessor 以使用 HttpContext.Session。

public TokenValidHandler(IHttpContextAccessor contextAccessor)
{
     _httpContext = contextAccessor.HttpContext;
}

我理解了 :

  1. 我没有正确检索 HttpContext.Session,它抛出 InvalidOperationException
  2. 请求不正确:路径为空,应该类似于“/Home/Index”

我在我的项目中重新使用了 SessionMiddleware,我可以看到用户会话已正确恢复到 HttpContext 中,但在我的策略中我会得到错误的会话。在 MVC 中间件之前正确添加了 SessionMiddleware。有任何想法吗 ?

解决方案(感谢@JoeAudette)保留访问器,直到您需要 HttpContext。

public TokenValidHandler(IHttpContextAccessor contextAccessor)
{            
    _accessor = contextAccessor;
}

protected override void Handle(AuthorizationContext context, TokenValidRequirement requirement)
{
    // Right context ...
    var contextHttp = _accessor.HttpContext;
}
4

1 回答 1

2

不要在构造函数中获取上下文,而是尝试保留 contextAccessor 并等待获取实际上下文,直到您需要检查它

于 2016-05-03T15:36:16.867 回答