0

すべてのセッションをデータベースに保存します。このセッションがクッキーではなくデータベースで失われたと想像してみましょう。FormsAuthentication.SignOut()の後にMVC-controllerを実行し続ける

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は存在しないため例外が発生します。だからリダイレクトした後でもGetDocumentsを呼び出そうとしています。

このエラーを回避する方法を教えてください。

ありがとうございます! :)

答えて

1

あなたのOnAuthorization関数からリダイレクトするべきではなく、むしろのようなfilterContextから結果のパラメータを設定します。それがうまく機能

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

!ありがとうございました。しかし、なぜOnAuthorizationからのリダイレクトを使用するのは適切ではありません。これら2つのアプローチの違いは何ですか? – podeig

+0

リダイレクトを自分で直接管理するのではなく、リダイレクトしたいことをmvcに指示して、リダイレクトを適切に管理できるようにする必要があるからです。あなたの "Response.Redirect"は、それ自体の途中でプロセスを停止するようなものです。 – billy

関連する問題