2015-04-23 5 views
7

У моего проекта возникла проблема с обновлением сеанса аутентификации форм из-за противоречивых форм Auth Cookies.Ошибка обновления аутентификации форм с аутентификацией пользовательских форм

Подробное описание:

После того как пользователь вошел в систему, один формирует куки аутентификации (FACookieA) создан, и он/аутентификацию. Однако, когда дело доходит до обновления файла cookie, создается вторая форма auth cookie (FACookieB), и FACookieA не обновляется. Пользователь перенаправляется на страницу входа на страницу после истечения срока действия в FACookieA, даже до истечения срока действия в FACookieB.

Сформированные печенье:

Пожалуйста, обратите внимание, что оба печенья имеют такое же имя.

FACookieA:

name: FormsAuth 
domain: .formsauth.com 

обратите внимание на "" предварительно дополнено .NET, то "formsauth.com" от форм раздела Authentication Ticket

FACookieB:

name: FormsAuth 
host: a.formsauth.com 

обратите внимание на печенье использует "хозяин", а не домен, а «а. formsauth.com "основан на текущем домене url запроса. URL

Проект испытания:

a.formsauth.com 

Web.config:

<forms loginUrl="~/Account/Login.aspx" name="FormsAuth"/> 

Код

public partial class Account_Login : System.Web.UI.Page 
{ 
    protected void LoginButton_Click(object sender, EventArgs e) 
    { 
     if (Membership.ValidateUser(LoginUser.UserName.Trim(), LoginUser.Password.Trim())) 
     { 
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, 
       "username", 
       DateTime.Now, 
       DateTime.Now.AddMinutes(2), 
       false, 
       string.Empty 
      ); 

      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      cookie.Domain = "formsauth.com"; 
      cookie.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Remove(cookie.Name); 
      Response.Cookies.Add(cookie); 
      Response.Redirect("~/Account/ChangePassword.aspx"); //authenticated area 

     }else 
     { 
      Response.Write("Invalid UserID and Password"); 
     } 
    } 
} 

Вопросы:

1) Как сгенерировать один файл auth cookie форм, чтобы пользователи могли продлить сеанс auth и не вышли из системы?

соображения:

1) Проект должен поддерживать несколько языков, с возможными форматами домена ниже:

a.formsauth.com 
a.en.formsauth.com 
a.us.formsauth.com 

и

b.formsauth.com 
b.en.formsauth.com 
b.us.formsauth.com 

Таким образом, я не могу установить домен атрибут элемента Forms декларативно. Поскольку два набора доменов не могут совместно использовать cookie, разрешено совместное использование cookie в пределах одного набора. Это же база кода используется для разных приложений с разными доменами. Но один набор доменов может совместно использовать cookie.

2) Встроенный FormsAuthenticationModule по умолчанию обновляет cookie сеанса пользователя, поэтому я не могу контролировать домен в cookie. Обратите внимание: FormsAuthenticationTicket используется для создания файла cookie при использовании логина, как показано выше.

Любая идея?

+0

Пожалуйста, пост код, который обновляет куки – Mike

+0

вы установите 'печенье. Domain = "formsauth.com"; 'когда вы обновляете cookie? –

+0

Я не очень хорошо помню ASP.NET Forms Auth, так что это может вообще не работать с вашей реализацией, но вы попробовали добавить 'slideExpiration =" true "cookieless =" UseCookies "timeout =" x "' в ' 'в вашем web.config? 'x' - это время в минутах бездействия, прежде чем пользователь снова войдет в систему. –

ответ

0

Логика кода не очень понятно, не понятно, почему вы пытаетесь заменить печенье.)

Однако я собираюсь предположить, что перенаправление происходит до того, как новый куки был зарегистрирован.

 Response.Cookies.Remove(cookie.Name); 

Добавить код здесь, чтобы проверить, если куки удалить, прежде чем вы попытаетесь добавить другой

 Response.Cookies.Add(cookie); 

Добавьте код здесь, чтобы убедиться, что куки был зарегистрирован в браузере (?), Прежде чем вы redirect

+0

Привет, не могли бы вы рассказать об этом и примере кода? – Pingpong

0

Вы не можете смешивать файлы cookie хоста и домена с тем же именем. Для выполнения этой работы все куки должны быть установлены в домене верхнего уровня.

0

Попробуйте использовать следующий код. Я надеюсь, что это вам поможет.

если (Membership.ValidateUser (LoginUser.UserName.Trim(), LoginUser.Password.Trim())) {

   int timeout = model.RememberMe ? 525600 : 30; 
       //DateTime timeout = model.RememberMe ? 525600 : 30; 
       string userData = JsonConvert.SerializeObject(model); 
       FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, login[0].adminUserName, DateTime.Now, DateTime.Now.AddMinutes(525600), false, userData); 

       string enTicket = FormsAuthentication.Encrypt(authTicket); 
       HttpCookie authcookie = new HttpCookie(FormsAuthentication.FormsCookieName, enTicket); 
       Response.Cookies.Add(authcookie); 



      return Response.Redirect("~/Account/ChangePassword.aspx"); //authenticated area 


      } 
      else 
      { 
       Response.Write("Invalid UserID and Password"); 
      } 
Смежные вопросы