Файлы cookie для проверки подлинности с помощью форм IE8 и ASP.Net не работают при открытии нескольких браузеров - PullRequest
8 голосов
/ 11 февраля 2010

У меня есть код ниже на странице входа. Я использую это, чтобы установить время ожидания входа в систему клиентом. В IE8 я сталкиваюсь с проблемой, что, если пользователь открывает другое окно браузера, затем выходит из системы в первом окне, когда они возвращаются обратно, они возвращаются к входу в систему после одной страницы (каждый раз). Если они не открывают другой браузер, все в порядке.

Я нашел ОЧЕНЬ много вопросов по этому поводу, но единственное найденное решение, которое работает, - это использование метода без файлов cookie (URI).

Я видел несколько статей, в которых говорилось об установке домена, что я и делаю, но это не работает. Кроме того, я попытался установить аутентификацию как постоянную, так и непостоянную. Ни один не сделал разницу. Я видел, что как только файл cookie аутентификации удален из папки, он не воссоздается при входе в систему.

Если я открою это второе окно браузера как «Новый сеанс», у меня не возникнет никаких проблем. (Это не практично, так как мы не можем научить каждого пользователя приложения открывать дополнительные окна таким образом.)

Есть ли какое-то исправление для этого, которое обнаружил кто-либо, что не предполагает использования подхода URI без файлов cookie?

int timeoutValue = 20 // This value is actually returned from a method;

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(LoginControl.UserName, false, timeoutValue);            
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);                 
authCookie.Domain = "my.domain";
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue);

HttpContext.Current.Response.Cookies.Add(authCookie);

Ответы [ 2 ]

3 голосов
/ 20 апреля 2010

Это «особенность» Internet Explorer для обмена файлами cookie / сессиями через окна браузера. Отсюда новая «функция» для создания «новой сессии» в IE8. Поэтому я не верю, что есть какой-то идеальный способ легко остановить это поведение.

Конечно, кроме того, чтобы остаться без печенья.

2 голосов
/ 05 февраля 2011

Я знаю, что это старый вопрос, но я боролся с этой же проблемой, и я думаю, что у меня есть решение. Я воспроизвел эти точные симптомы и смог успешно устранить их (по крайней мере, пока).

Только установка истечения срока действия куки, если вы хотите постоянный билет авторизации, устраняет проблему для меня.

Вот мой метод в его нынешнем виде:

internal static void CreateAuthenticationCookie(string userName, bool rememberMe, bool expired = false)
{
    int timeout = expired ? -1440 : (rememberMe ? 43200 : 20); // Timeout in minutes, 525600 = 365 days, 1440 = 1 day.
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, userName, DateTime.Now, DateTime.Now.AddMinutes(timeout), rememberMe, string.Empty);
    string encrypted = FormsAuthentication.Encrypt(ticket);
    var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted);

    if (rememberMe)
        cookie.Expires = System.DateTime.Now.AddMinutes(timeout);

    HttpContext.Current.Response.Cookies.Add(cookie);
}

А вот как я это называю:

if(createPersistentCookie)
    CreateAuthenticationCookie(userName, createPersistentCookie);
else
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);

Я понимаю, что по тому, как я его называю, нет необходимости в параметре "запомнить меня" в методе CreateAuthenticationCookie (поскольку в этом случае я всегда передаю значение true), но я еще не реорганизовал его, и он лучше демонстрирует, как кто-то может захотеть его использовать.

Я хотел бы иметь способ легко иметь скользящий срок действия, если пользователь решил не «помнить меня», но если он выбрал «запомнить меня», я не хотел бы ограничиваться 30-минутным тайм-аутом моего не » запомнить меня "пользователи. Моя цель состояла в том, чтобы, если кто-то использует общедоступный компьютер, он получил скользящее истечение срока действия и не помнил меня, но если он использует персональный компьютер, он может «запомнить меня» и не быть ограниченным настройкой таймаута в web.config. Не знаю, что все это относится к вашей ситуации, но я надеюсь, что это кому-нибудь поможет или что моя методология может вызвать некоторую конструктивную критику, чтобы я мог вносить коррективы в случае необходимости.

PS. Вот мои настройки web.config для аутентификации форм:

<authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="30" slidingExpiration="true"/>
</authentication>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...