2

我使用MVC網站的表單身份驗證,我有一個問題,添加餅乾,我使用加密的表單身份驗證票並將其添加到Cookie,但在檢查我的餅乾時,它是在那裏(由命名「AuthCookie」),但價值總是空和過期日期始終設置爲「01/01/0001 00:00」 ......這是我的登錄控制器代碼:MVC 3餅乾不工作

[HttpPost] 
public ActionResult Index(Login login, string returnUrl) 
{ 
    if (ModelState.IsValid) 
     try 
     { 
      User user = UserManager.Login(login.Username, login.Password); 
      string serialUser = Serialize.SerializeToString(user); 
      string ticket = FormsAuthentication.Encrypt(
       new FormsAuthenticationTicket(1, login.Username, DateTime.Now, DateTime.Now.AddMinutes(20.0), login.RemeberMe, serialUser)); 

      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket) { Expires = DateTime.Now.AddMinutes(20) }; 
      Response.Cookies.Add(cookie); 


      if (String.IsNullOrEmpty(returnUrl)) 
       return RedirectToAction("Index", "Home"); 
      else 
       return Redirect(returnUrl); 
     } 
     catch (LoginFailedException) 
     { 
      ModelState.AddModelError("", "Login failed: Invalid Username or Password."); 
      return View(login); 
     } 
    else 
     return View(login); 

} 

起初我以爲由於長度的原因,加密的字符串不工作,但我已經通過創建一個簡單的測試庫來測試了這一點,並且我得到了相同的結果。

誰能幫

+1

是否有你沒有使用FormsAuthentication.SetAuthCookie()的原因? – rfmodulator 2012-01-02 00:13:26

+0

使用SetAuthCookie()你沒有訪問userData ...我將用它來存儲UserRole和其他可選數據IPrincipal和IIdentity – 2012-01-02 00:15:52

+1

我明白了。我不確定是否將角色數據存儲在客戶端上是一個好主意。 :)加密或以其他方式。 – rfmodulator 2012-01-02 00:17:35

回答

3

當你呼叫重定向()或RedirectToAction(),你終止響應,因此Cookie不會發送到客戶端。某些解決方案:

  1. 使用TempData將信息持續存儲在直接頁面中,將Cookie寫入您重定向到的操作中。
  2. 查看錶單身份驗證Cookie信息寫入NerdDinner code on CodePlex的方式。
  3. 正如評論中所述,您可以在Session中保留角色信息。將角色信息存儲在Session中並從角色中檢索(如果未找到)的建議可能會奏效,但我會先按照原樣使用成員資格系統,然後再調整性能,如果發現問題存在,而不是假定它會成爲問題。
+0

我現在正在使用上面提到的自定義角色提供程序,這已經很好地解決了我的角色問題。作爲regrads設置我的身份驗證票,我看着書呆子晚餐的例子(謝謝你),它看起來像這只是設置身份驗證cookie的方式是: 驗證用戶... 設置身份驗證Cookie .. 重定向到請求的原始頁面... – 2012-01-10 11:21:05

+0

@JonGalloway。解決方案編號爲3的問題是,您無法通過「AuthenticateRequest_handler」進行會話,通常用於設置Thread.CurrentPrincipal(您需要角色)。 – tggm 2012-07-24 10:48:56