2012-12-11 142 views
7

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

它使用普通IHttpModule s到做的工作:BeginRequest检查传入的cookie,并设置HttpContext.Current.UserThread.CurrentPrincipal,认证成功后

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

EndRequest问题所需的所有cookie进行身份验证的用户。

这一直是个做工精细了,但在某些系统上(我真的不能告诉如何从那些其实这上工作他们不同)ASP.NET似乎正在失去的HttpContext.Current.User价值,取代它无论默认值如何(GenericPrincipal汇总GenericIdentityIsAuthenticated设置为false等)。

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

+0

我遇到同样的问题。任何解决方案 –

+0

有关症状的更多详情?这是发生在一个用户还是多个用户?在受影响的系统中,是否每次或仅在某些时间丢失用户,以及是否仅在某些时间丢失用户多久? –

回答

2

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

我以前有过使用ASP.NET启用RoleManager模块的问题。将以下内容添加到web.config的system.web部分中修复了它。

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

这里是我所做的解决这个问题的一些放大信息:

1)弄清楚什么其他模块运行。这里有一个article,它提供了一些代码。

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

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