6

我有自己的身份验证系统 ( https://bitbucket.org/anton_gogolev/octalforty-structural ),它不使用任何标准的 ASP.NET 东西 ( <authentication mode="None" />)。

它使用 plain IHttpModules 来完成它的工作:BeginRequest检查传入的 cookie 和设置HttpContext.Current.User,并Thread.CurrentPrincipal在成功验证后

Thread.CurrentPrincipal = HttpContext.Current.User = 
    new GenericPrincipal(tokenIdentity,new string[] { });

EndRequest为经过身份验证的用户发出所有必需的 cookie。

这几个月来一直运行良好,但在某些系统上(我真的无法判断它们与实际运行的系统有何不同)ASP.NET 似乎正在失去 的值HttpContext.Current.User,用任何默认值替换它(GenericPrincipal聚合GenericIdentity设置IsAuthenticatedfalse等)。

所以问题是:如何以及为什么会HttpContext.Current.User迷路?

4

1 回答 1

3

听起来好像有另一个模块在 BeginRequest 之后修改 HttpContext.Current.User。我建议在 PostAuthenticateRequest 中设置它。

在启用 RoleManager 模块的 ASP.NET 之前,我遇到过这个问题。将以下内容添加到 web.config 的 system.web 部分修复了它。

<httpModules>
     <remove name="RoleManager"/>
</httpModules>

以下是有关我为解决此问题所做的一些详细信息:

1)找出其他模块正在运行。这是一篇文章,提供了一些执行此操作的代码。

2) 确保将 HttpContext.Current.User 设置在正确的位置。BeginRequest 不是一个好地方。 PostAuthenticateRequest 通常是最好的(并且推荐)。如果另一个模块也在使用 PostAuthenticateRequest 并且它恰好在你的模块之后运行,这不会阻止问题,但在许多情况下它会解决问题(使用上面的 web.config 片段)。

3) 有选择地禁用每个已安装的模块并测试您的应用程序,直到您的自定义 Principal 对象未被覆盖。

于 2012-12-11T17:14:42.570 回答