我已经实现了自定义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);
如果username:password组合有效,则
AuthUser.CreateAuthUser()
返回一个IPrincipal
,其中IIdentity
为true
返回IsAuthenticated
。设置完此选项后,Login操作处理程序将重定向到用户最初要访问的页面,现在在
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
最佳答案
会话不是必需的。您可以使用加密的用户ID在浏览器中存储仅HTTP cookie。在您的过滤器中,检查此cookie并使用存储的用户ID重新加载您的用户并将其设置在HttpContext中。