2014-01-08 83 views
0

我正在MVC.net應用程序的永久登錄工作,我曾嘗試在FormAuthantication中使用IsPersistent = true,但是如果我重新啓動iis,那麼它將註銷使用 下面是負責的代碼爲登錄電子。在mvc.net永久登錄

public void SetLoginData(UserLoginInfo userLoginInfo) 
     { 
      HttpContext .Current.Session[SessionUserEmailIdKey] = userLoginInfo.Email; 
      HttpContext.Current.Session[SessionWelcomeNameKey] = userLoginInfo.FirstName; 
      HttpContext.Current.Session[SessionWelcomeRegistrationIdKey] = userLoginInfo.RegistrationId; 

      HttpContext.Current.Session[SessionLoginInfoKey] = userLoginInfo; 
      const bool isPersistent = true; 
      const string userData = "user"; 

      var ticket = new FormsAuthenticationTicket(1, 
                 userLoginInfo.RegistrationId.ToString(
                  CultureInfo.InvariantCulture), 
                 DateTime.UtcNow, 
                 DateTime.UtcNow.AddMinutes(180), 
                 isPersistent, 
                 userData, 
                 FormsAuthentication.FormsCookiePath); 

      string encTicket = FormsAuthentication.Encrypt(ticket); 
      HttpContext.Current.Request.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 
      HttpContext.Current.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 
     } 

請告訴我如何可以實現登錄,這樣即使重新啓動應用程序,用戶也不會Ë註銷。

回答

4

爲了創建永久登錄,您需要確保兩件事情到位(因爲您正在使用FormsAuthentication)。

首先 - 確保您的票證過期時間設置爲某個出路在未來

= new FormsAuthenticationTicket(1, 
     userLoginInfo.RegistrationId.ToString(CultureInfo.InvariantCulture), 
     DateTime.UtcNow, 
     DateTime.UtcNow.AddYears(20), 
     isPersistent, 
     userData, 
     FormsAuthentication.FormsCookiePath); 

第二個(最有可能的原因用戶越來越踢出網站的當您重新啓動IIS)是創建一個使用靜態密鑰對設置web.config中的machineKey部分。默認情況下,IIS爲每個應用程序自動生成一個machineKey。這是用來加密/解密您的表單身份驗證票據的。如果IIS重新啓動,您很可能會在此實例中獲得新的計算機密鑰,這意味着該票據無法解密....意味着用戶必須重新登錄。通過創建/定義靜態密鑰,您可以防止在IIS回收時發生密鑰更改。設置機器密鑰的信息可以是found on MSDN here

最後,表單認證有ZERO與會話和會話管理有關。它們是相互排斥的,並且在典型場景中不會相互影響。當用戶登錄時,會給它們一個加密的cookie,其中包含到期時間和用戶名。這是存儲在會話中的不是,因此調整會話設置不會影響用戶登錄。