ASP.NET MVC中的完全自定义身份验证:丢失HttpContext.User
我有我自己的身份验证系统(
https://bitbucket.org/anton_gogolev/octalforty-structural),它不使用任何标准的ASP.NET东西(< authentication mode =“None”/>).
它使用普通的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,IsAuthenticated设置为false等). 所以问题是:HttpContext.Current.User如何以及为什么会丢失? 解决方法
听起来有另一个模块在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)有选择地禁用每个已安装的模块并测试您的应用程序,直到您的自定义Principal对象未被覆盖. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – RavenDB Ids和ASP.NET MVC3路由
- unit-testing – 对ActionFilter进行单元测试 – 正确设置A
- 实现ASP.NET MVC应用程序的全文搜索的最佳方法是什么?
- asp.net – 通过ASP .Net成员身份进行用户登录
- asp.net – WinForms和Asp的类库中的异常处理
- Asp.net webForm设置允许表单提交Html的方法
- asp.net-mvc – WebForms和MVC可以存在于一个项目中吗?
- asp.net-mvc – 为什么log4net不记录nhibernate信息
- asp.net-mvc – 不同语言的MVC数据注释?
- 多终端数据同步机制设计(一)
- asp.net – 从Google财经,雅虎金融或交易所获取股
- asp.net-mvc – 如何使用OutputCacheProfiles来压
- asp.net-mvc – ASP.NET MVC2和MemberShipProvid
- 一段时间后的第一个请求总是很慢 – ASP.NET MVC
- asp.net – IIS由什么组成,它是如何工作的?
- asp.net-mvc – 如何在我的Asp.net Mvc中使用lin
- iis – 在经典ASP / Javascript中将对象插入全局
- ASP.NET – IHttpModule.BeginRequest触发2X,App
- ASP.NET Core中的依赖注入(4): 构造函数的选择
- asp.net-mvc – 验证消息中的换行符