ASP.NET MVC中的完全自定义身份验证:丢失HttpContext.User

Ant*_*lev 6 asp.net security

我有我自己的身份验证系统(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迷路?

Joe*_*ger 3

听起来好像有另一个模块在 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) 有选择地禁用每个已安装的模块并测试您的应用程序,直到您的自定义主体对象不被覆盖。