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。

如何避免此错误?

谢谢! :)

回答

1

你不应该从你的OnAuthorization功能重定向而是从filterContext的结果集参数为这样:

filterContext.Result == new RedirectToRouteResult(new RouteValueDictionary { 
{ 
    "controller", 
    "Utilisateurs" 
}, 
{ 
    "action", 
    "Connexion" 
}, 
{ 
    "ReturnUrl", 
    filterContext.HttpContext.Request.RawUrl 
} 
}); 
+0

它工作得很好!谢谢。但是为什么使用OnAuthorization的重定向是不对的。这两种方法有什么不同? – podeig

+0

因为你不应该直接管理自己的重定向,而是向mvc表明你想重定向,因此允许它正确地管理重定向。你的“Response.Redirect”有点像在本身停止进程。 – billy