0

所以,我想要完成的是我的應用程序的用戶基本的「記住我」風格的行動。MVC4表單身份驗證自動登錄

到目前爲止,我已經完成了所有工作,並且大部分時間都按預期工作。有時候,檢查持久化Forms身份驗證票證的方法不會自動登錄,我不知道爲什麼它只是偶爾發生

爲了測試我的代碼,我所做的是啓動調試器,在chrome的開發工具中手動殺掉我的會話cookie,然後重新加載頁面。單步執行代碼,它會按預期方式進入自動登錄方法,並繼續重置會話數據。但是,如果我等待4個小時的時間過長,並嘗試使用相同的功能,它不會自動重置我的會話。 (假設我已經讓調試器運行了這段時間)。

編輯:爲了清楚起見,發生此錯誤時,我可以打開開發工具並查看身份驗證票據是否仍可用。這只是重置我的會話的代碼要麼不運行,要麼在某處出錯。由於這種情況發生頻率很低,因此很難追查。

因此,到代碼。

我在控制器的構造函數中調用靜態無效自動登錄方法,並將httpcontext傳遞到自動登錄方法中。

控制器

public class SiteController : Controller 
{ 
    public SiteController() 
    { 
     this.UserAutoLogin(System.Web.HttpContext.Current); 
    } 

    // GET: /Site/ 
    public ActionResult Index() 
    { 
     ViewBag.CatNav = this.RenderNavCategories(); 
     return View(); 
    } 
} 

自動登入碼

public static void UserAutoLogin(this Controller Controller, System.Web.HttpContext context) 
{ 
    HttpCookie cookie = HttpContext.Current.Request.Cookies.Get(FormsAuthentication.FormsCookieName); 

    if (cookie != null) 
    { 
     FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 

     if (ticket != null) 
     { 
      if (ticket.Name.Length > 0) 
      { 
       try 
       { 
        if (context.Session["UserName"] == null) 
        { 
         //get user from db 
         PersonRepository PersonRepo = new PersonRepository(); 
         PersonModel Member = PersonRepo.GetUserUserName(ticket.Name); 

         if (Member.FirstName != null) //if this is null...then the cookie is wrong, so don't do shit 
         { 
          //Set the session parameters 
          context.Session["FirstName"] = Member.FirstName; 
          context.Session["LastName"] = Member.LastName; 
          context.Session["UserId"] = Member.Id; 
          context.Session["UserName"] = Member.Username; 
          context.Session["Email"] = Member.Email; 
          context.Session["IsUser"] = 1; 
          context.Session["Zip"] = Member.Zip; 

          FormsAuthentication.SignOut(); 
          FormsAuthentication.SetAuthCookie(Member.Username, true); 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        // don't do anything for now - do something smart later :)       
        Console.WriteLine(ex.ToString()); 
       } 
      } 
     } 
    } 
} 
+0

看看這個問題:http://stackoverflow.com/questions/5619791/implementing-remember-me-feature-in- asp-net-mvc – Kostadin

+0

欣賞這個回覆,但是這對我沒有任何幫助。 – mituw16

+0

是否有什麼特別的原因,你爲什麼要傳遞HttpContext.Current到AutoLogin方法,而不是使用Controller中的一個,然後在獲取Cookie時忽略它(再次調用HttpContext.Current)?看起來你不知道你在那裏做什麼。 – MikeSW

回答

0

因爲當IIS是回收應用,生成新的計算機密鑰。 FormsAuthentication憑單使用該密鑰進行簽名,因此當密鑰更改舊憑單時無法識別。您需要使用固定的機器密鑰。

編輯:刪除鏈接密鑰生成器的網站(現已解散)

+0

謝謝,我會給這個鏡頭。 – mituw16

+0

這似乎是工作,我想你打在頭上邁克。謝謝! – mituw16

+0

此鏈接正在進入中文網站 – Dev