我有我自己的身份验证系统(https://bitbucket.org/anton_gogolev/octalforty-structural),它不使用任何标准的ASP.NET东西(<authentication mode="None" />).
它使用plain IHttpModule来完成它的工作:BeginRequest检查传入的cookie和设置HttpContext.Current.User以及Thread.CurrentPrincipal成功的身份验证
Thread.CurrentPrincipal = HttpContext.Current.User =
new GenericPrincipal(tokenIdentity,new string[] { });
Run Code Online (Sandbox Code Playgroud)
然后EndRequest为经过身份验证的用户发出所有必需的cookie.
这已经好几个月了,但在某些系统上(我真的不知道它们与实际工作的有什么不同)ASP.NET似乎正在失去它的价值HttpContext.Current.User,用它所取代的任何默认值替换它(与set 等GenericPrincipal聚合).GenericIdentityIsAuthenticatedfalse
所以问题是:如何以及为何HttpContext.Current.User迷路?
听起来好像有另一个模块在 BeginRequest 之后修改 HttpContext.Current.User 。我建议在 PostAuthenticateRequest 中设置它。
我之前在 ASP.NET 启用 RoleManager 模块时遇到过这个问题。将以下内容添加到 web.config 的 system.web 部分修复了该问题。
<httpModules>
<remove name="RoleManager"/>
</httpModules>
Run Code Online (Sandbox Code Playgroud)
以下是有关我为解决此问题所做的一些详细信息:
1)找出正在运行的其他模块。这是一篇文章,提供了一些执行此操作的代码。
2)确保您在正确的位置设置 HttpContext.Current.User。BeginRequest 不是一个好的挂钩位置。PostAuthenticateRequest 通常是最好的(也是推荐的)。如果另一个模块也在使用 PostAuthenticateRequest 并且它恰好在您的模块之后运行,这不会阻止该问题,但在许多情况下它会解决问题(使用上面的 web.config 代码段)。
3) 有选择地禁用每个已安装的模块并测试您的应用程序,直到您的自定义主体对象不被覆盖。
| 归档时间: |
|
| 查看次数: |
1968 次 |
| 最近记录: |