2014-01-08 60 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,其中包含到期时间和用户名。这是存储在会话中的不是,因此调整会话设置不会影响用户登录。