我已经实现了自定义AuthCheckAttribute
并在我的应用程序中全局使用它。
我已经确认控制流程正确且AllowAnonymousAttribute
正在得到正确尊重。
在我的登录操作处理程序中,我按如下方式设置当前User
:
//This user is an NHibernate entity representing a user of the
//app. AuthUser takes the Identity.Name from here.
HttpContext.User = AuthUser.CreateAuthUser(user);
如果用户名:密码组合有效,则AuthUser.CreateAuthUser()
会返回IPrincipal
,IIdentity
会返回true
IsAuthenticated
。
设置完成后,登录操作处理程序会重定向到用户最初要访问的页面,现在在AuthCheckAttribute.OnAuthentication()
方法中,context.HttpContext.User
设置为System.Security.Principal.WindowsPrincipal
的实例(并且IsAuthenticated
返回false)而不是我在登录处理程序中设置的AuthUser
。
我做错了什么?问题似乎是我在登录操作处理程序中设置的User
丢失/被执行时间再次到达AuthCheckAttribute.OnAuthentication()
所取代。
我有一个课程AuthUser : IPrincipal
和AuthIdentity : IIdentity
。对AuthUser.CreateAuthUser(user)
的调用会正确地实例化AuthUser
和AuthIdentity
类,因此没有问题。
配置:MVC5,.Net 4.5
答案 0 :(得分:1)
没有必要开会。您可以使用加密的用户ID在浏览器中存储仅HTTP的cookie。在您的过滤器中,检查此cookie并使用存储的用户ID重新加载您的用户并在HttpContext中设置它。