【发布时间】:2016-05-03 15:20:24
【问题描述】:
我们使用自定义策略来检查一些数据库要求(数据库中持久化的令牌),并且我需要会话信息,因此我注入了 IHttpContextAccessor 以使用 HttpContext.Session。
public TokenValidHandler(IHttpContextAccessor contextAccessor)
{
_httpContext = contextAccessor.HttpContext;
}
我可以看到:
- 我没有正确检索 HttpContext.Session,它会抛出 InvalidOperationException
- 请求不正确:Path 为空,应该类似于“/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;
}
【问题讨论】:
-
不要在构造函数中获取上下文,而是尝试保留 contextAccessor 并等待获取实际上下文,直到您需要检查它之前
-
这就是解决方案 :) 很多小时只是为了这个......也许你可以发布一个回复,这样我就可以将其标记为解决
-
很高兴,我已将其发布为答案
-
理想情况下,您可能希望将过滤器重新设计为身份验证中间件并使用新的基于声明的授权块,这不需要实现自定义代码。
-
@Pinpoint 我将 Policy 用于特定的身份验证操作和基于声明的授权,您有您所说的示例吗?
标签: c# asp.net-core asp.net-identity-3