2009-06-18 8 views
3

私は基本的にASP.NET MVCサンプルからAccountControllerを使用しています。 FormsAuthenticationを使用してユーザーログインを処理します。念のために、ここではユーザログインを処理するコードは次のとおりです。ログイン後すぐにActionFilterでUser.Identity.IsAuthenticatedを確認してください

public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl) 
    { 
     if (!ValidateLogOn(userName, password)) 
     { 
     return View(); 
     } 

     FormsAuth.SignIn(userName, rememberMe); 


     //Session["userId"] = 1; 


     if (!String.IsNullOrEmpty(returnUrl)) 
     { 
     return Redirect(returnUrl); 
     } 
     else 
     { 
     return RedirectToAction("Index", "Home"); 
     } 
    } 

あなたはコメント行から見ることができるように、私はこの方法では、セッション変数を設定したいと思います。しかし、私はコントローラでセッション変数を直接設定するのが最もエレガントな方法ではないと考えました。このメソッドを単体テストするときには不便です(ただし、私はそれを気にすることができますが、それでもなお)。

このログインルーチンの後に実行されるカスタムActionFilterAttributeを作成しました。ログインが成功した場合は、このカスタム属性でセッション変数を設定します。このためのコードは次のとおりです。

public class SetSessionAttribute : ActionFilterAttribute 
    { 
    public override void OnResultExecuted(ResultExecutedContext resultContext) 
    {  
     if (resultContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
     resultContext.HttpContext.Session["userId"] = 1; 
     } 

     base.OnResultExecuted(resultContext); 
    } 
    } 

問題は、常に次の「ページ・ロード」まで、falseを返すUser.Identity.IsAuthenticatedということです。私はページライフサイクルで呼び出される最後のメソッドであるが、運がないことを集めて、OnResultExecutedをオーバーライドしています。 OnActionExecutingOnActionExecutedOnResultExecutingも試しましたが、常にfalseです。

これには洗練されたソリューションがありますか?または私はあきらめて、コントローラのセッション変数を直接設定する必要がありますか?

答えて

0

User.Identity.IsAuthenticatedは次のページリクエストまで真であったため、ユーザーがアプリケーションで実際に作業を終えているかどうかを知る方法が必要だったため、同様の問題がログアウトしました。

私はあなたがセッションまたはViewData変数をコントローラに設定するか、それを別のコントローラにrouteValues経由で渡すべきだと思います。

+0

返信いただきありがとうございます。はい、私はコントローラでセッションを設定することができますが、それは私が避けようとしたものです。私はまだそれに実行可能な代替があることを願っています。 – Razzie