0
我将所有会话保存在数据库中。让我们想象这个会话在数据库中丢失了,而不是在cookies中。在FormsAuthentication.SignOut()后继续执行MVC控制器
在OnAuthorization(AuthorizationContext filterContext)中,我从数据库中检索用户对象的基础上的会话ID。
if (HttpContext.User.Identity.IsAuthenticated)
{
//Gets user data from DB.
var user = userRepos.GetUser(HttpContext.User.Identity.Name);
if (user != null)
{
CurrentUser = user;
Thread.CurrentPrincipal = HttpContext.User = new DibPrincipal(user);
return;
}
else
{
FormsAuthentication.SignOut();
Session.Abandon();
Response.Redirect(FormsAuthentication.LoginUrl, true);
}
}
}
想象一下,用户调用控制器GetDocuments,但他被重定向到FormsAuthentication.LoginUrl。它的工作原理是,用户被重定向,但是我得到了异常,它在GetDocument控制器中显示错误,因为CurrentUser不存在。因此.net甚至在重定向之后尝试调用GetDocuments。
如何避免此错误?
谢谢! :)
它工作得很好!谢谢。但是为什么使用OnAuthorization的重定向是不对的。这两种方法有什么不同? – podeig
因为你不应该直接管理自己的重定向,而是向mvc表明你想重定向,因此允许它正确地管理重定向。你的“Response.Redirect”有点像在本身停止进程。 – billy