我基本上使用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");
}
}
你可以從註釋行看到,我想設置一個會話變量在此方法。但是,我認爲這不是直接在控制器中設置Session變量的最優雅方式。單元測試這種方法也是不方便的(雖然我可以嘲笑它,當然,但仍然)。
所以,我想,我創建了一個自定義的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);
}
}
的問題是,User.Identity.IsAuthenticated
始終返回false,直到下一個「頁面加載」。我在覆蓋OnResultExecuted
,因爲我收集它是在頁面生命週期中調用的最後一種方法,但沒有運氣。我也試過OnActionExecuting
,OnActionExecuted
和OnResultExecuting
,但它總是假的。
有沒有一個優雅的解決方案呢?還是應該放棄並直接在控制器中設置會話變量?
感謝您的回覆。是的,我可以在控制器中設置會話,但這正是我試圖避免的。我仍然希望有一個可行的替代方案。 – Razzie 2009-06-19 10:03:08