私は基本的に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
をオーバーライドしています。 OnActionExecuting
、OnActionExecuted
、OnResultExecuting
も試しましたが、常にfalseです。
これには洗練されたソリューションがありますか?または私はあきらめて、コントローラのセッション変数を直接設定する必要がありますか?
返信いただきありがとうございます。はい、私はコントローラでセッションを設定することができますが、それは私が避けようとしたものです。私はまだそれに実行可能な代替があることを願っています。 – Razzie