我已经实现了自定义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,其中IIdentitytrue返回IsAuthenticated

设置完此选项后,Login操作处理程序将重定向到用户最初要访问的页面,现在在AuthCheckAttribute.OnAuthentication()方法中,context.HttpContext.User设置为System.Security.Principal.WindowsPrincipal的实例(并且IsAuthenticated返回false),而不是我在登录处理程序中设置的AuthUser

我究竟做错了什么?问题似乎是我在登录操作处理程序中设置的User在执行再次达到AuthCheckAttribute.OnAuthentication()时丢失/替换了。

我有一个类AuthUser : IPrincipalAuthIdentity : IIdentity。对AuthUser.CreateAuthUser(user)的调用正确地实例化了AuthUserAuthIdentity类,因此在那里没有问题。

配置:MVC5,.Net 4.5

最佳答案

会话不是必需的。您可以使用加密的用户ID在浏览器中存储仅HTTP cookie。在您的过滤器中,检查此cookie并使用存储的用户ID重新加载您的用户并将其设置在HttpContext中。

10-06 11:00