2016-10-21 2 views
0

Я пытаюсь реализовать помню мне fonctionnality для моего сайта asp.net.Asp.net - запомнить меня - пользователь всегда аутентифицирует проблему

Сценарий: Пользователь не зарегистрирован «check me». Он выходит из системы или закрывает вкладку/браузер.

Проблема: Когда пользователь возвращается на страницу входа в систему, он видит, что он подключен, как если бы он проверил «запомнить меня».

Это код Login.aspx.cs:

protected void Page_Load(object sender, EventArgs e) 
{ 
    myCookies = Request.Cookies; 
    HttpCookie authCookie = myCookies.Get(FormsAuthentication.FormsCookieName); 

    if (authCookie != null) // Always true! 
    { 
     HttpContext page = HttpContext.Current; 

     System.Security.Principal.IIdentity identity = page.User.Identity; 

     if (identity.IsAuthenticated) // Always true! 
     { 
      //do some data loading 

      Response.Redirect("~/default.aspx?p=Profil"); 


     } 
    } 
    else if (!Page.IsPostBack) 
    { 
     Session.Abandon(); 
    } 
} 

protected void LoginUser_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if (userCredentialValid()) 
    { 
     HttpCookie formAuthCook; 
     Response.Cookies.Clear(); 

     if (LoginUser.RememberMeSet) 
     { 
      DateTime expiryDate = DateTime.Now.AddDays(30); 
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, LoginUser.UserName, DateTime.Now, expiryDate, true, String.Empty); 
      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      formAuthCook = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      formAuthCook.Expires = ticket.Expiration; 
      formAuthCook.HttpOnly = true; 
      formAuthCook.Secure = true; 

      Response.Cookies.Add(formAuthCook); 
     } 
     else 
     { 
      formAuthCook = mesCookies.Get(FormsAuthentication.FormsCookieName); 
      if (formAuthCook != null) 
      { 
       formAuthCook.Expires = DateTime.Now; 
       Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      } 
     } 

     e.Authenticated = true; 
    } 
    else 
    { 
     e.Authenticated = false; 
    } 

} 

Спасибо заранее!

РЕДАКТИРОВАТЬ: Проверено на Chrome и Firefox.

+0

Это может быть проблема с браузером. Chrome работает автоматически, как и другие браузеры. Они сохраняют файлы cookie, даже если разработчик сайта не хочет этого делать. См. Https://bugs.chromium.org/p/chromium/issues/detail?id=128513 – Igor

+0

Интересно! Но проблема такая же с Firefox ... – UnBoug

+0

Firefox предлагает ту же функциональность, что и я, как и многие браузеры. Вы можете проверить его, отключив эту «функцию», чтобы узнать, связано ли это с этим или нет. – Igor

ответ

0

Я думаю, что нашел обходной путь!

создать печенье, чтобы указать, когда сеанс повторяется:

protected void LoginUser_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    if (userCredentialValid()) 
    { 
     HttpCookie formAuthCook; 
     Response.Cookies.Clear(); 

     if (LoginUser.RememberMeSet) 
     { 
      Response.Cookies.Clear(); 
      //set the new expiry date – to thirty days from now 
      DateTime expiryDate = DateTime.Now.AddDays(1); 
      //create a new forms auth ticket 
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, LoginUser.UserName, DateTime.Now, expiryDate, true, String.Empty); 
      //encrypt the ticket 
      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      //create a new authentication cookie – and set its expiration date 
      formAuthCook = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      formAuthCook.Expires = ticket.Expiration; 
      formAuthCook.HttpOnly = true; 
      formAuthCook.Secure = true; 

      //######################### EDIT ################################# 
      HttpCookie sCookPersistent = new HttpCookie("pSession"); //In my code I use a constante for cookie name 
      sCookPersistent.Value = "1"; 
      sCookPersistent.HttpOnly = true; 
      sCookPersistent.Secure = true; 
      sCookPersistent.Expires = ticket.Expiration; 
      ////######################### EDIT END ########################## 

      //add the cookie to the response. 
      Response.Cookies.Add(formAuthCook); 
      Response.Cookies.Add(sCookPersistent);//##### EDIT 
     } 
     else 
     { 
      formAuthCook = mesCookies.Get(FormsAuthentication.FormsCookieName); 
      if (formAuthCook != null) 
      { 
       formAuthCook.Expires = DateTime.Now; 
       Response.Cookies.Remove(FormsAuthentication.FormsCookieName); 
      } 

      //######################### EDIT ################################# 
      if (Request.Cookies["pSession"] != null) 
      { 
       Request.Cookies["pSession"].Expires = DateTime.Now; 
       Response.Cookies.Remove("pSession"); 
      } 
      ////######################### EDIT END ########################### 
     } 

     e.Authenticated = true; 
    } 
    else 
    { 
     e.Authenticated = false; 
    } 
} 

И в загрузке страницы:

HttpCookieCollection myCookies = Request.Cookies;    
HttpCookie authCookie = myCookies.Get(FormsAuthentication.FormsCookieName); 
bool authCookieValid = false; 

if (authCookie != null) 
{ 
    //Cookie created if the user checked the remember me checkbox 
    //if null the session is not persistent 
    if (Request.Cookies["pSession"] == null) 
    { 
     authCookie.Expires = DateTime.Now; 
     Response.Cookies.Set(authCookie); 
    } 
    else if (!string.IsNullOrEmpty(authCookie.Value)) 
    { 
     authCookieValid = true; 
    } 
} 

Это не пуленепробиваемым, но это делает работу на данный момент.

Если у вас есть предложения, дайте мне знать. :)