2009-06-18 64 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"); 
     } 
    } 

你可以從註釋行看到,我想設置一個會話變量在此方法。但是,我認爲這不是直接在控制器中設置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,OnActionExecutedOnResultExecuting,但它總是假的。

有沒有一個優雅的解決方案呢?還是應該放棄並直接在控制器中設置會話變量?

回答

0

我在註銷時遇到類似問題,因爲User.Identity.IsAuthenticated在下一個頁面請求之前是真實的,但我需要一種方法來知道用戶是否真的完成了應用程序的工作。

我想你應該在控制器中設置Session或ViewData變量或通過routeValues傳遞給另一個控制器。

+0

感謝您的回覆。是的,我可以在控制器中設置會話,但這正是我試圖避免的。我仍然希望有一個可行的替代方案。 – Razzie 2009-06-19 10:03:08