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