Файл cookie проверки подлинности ASP.NET - PullRequest
4 голосов
/ 05 мая 2011

В приложении с проверкой подлинности на основе форм у меня есть стандартный элемент управления ASP.NET Login со следующим обработчиком событий Authenticate.

void Login_Authenticate(object sender, AuthenticateEventArgs e)
{
    if (Security.AuthenticateUser(Login.UserName, Login.Password))
    {
        e.Authenticated = true;
        RedirectFromLoginPage(Login.UserName);
    }
    else
    {
        e.Authenticated = false;
    }
}

Функция RedirectFromLoginPage выглядит следующим образом:

private void RedirectFromLoginPage(String username)
{
    String returnUrl = GetReturnUrl();
    FormsAuthentication.SetAuthCookie(username, true, "/");
    Response.Redirect(returnUrl, true);
}

Это прекрасно работает в 99% случаев.Тем не менее, я иногда получаю звонки в службу поддержки от людей, которые не могут войти в систему. Они вводят свои учетные данные, перенаправляются обратно на домашнюю страницу (что и происходит, когда все работает нормально), но они не входят в систему.

Понимая, что это может быть проблема с файлами cookie, я попытался воспроизвести проблему в своей среде, установив для параметров конфиденциальности значение «Блокировать все файлы cookie», и мне удалось воспроизвести проблему.Функция SetAuthCookie вызывается, но при загрузке следующей страницы HttpContext.Current.User.Identity.IsAuthenticated возвращает значение false.

В моем файле web.config аутентификация устанавливается следующим образом:

<authentication mode="Forms">
  <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/>
</authentication>

Чтение документации поMSDN о AutoDetect и SetAuthCookie, я получил, что:

AutoDetect Указывает, что куки используются, если профиль устройства поддерживает куки;в противном случае файлы cookie не используются. Для браузеров настольных компьютеров, которые, как известно, поддерживают файлы cookie, будет использоваться механизм проверки, чтобы попытаться использовать файлы cookie при включении.Если устройство не поддерживает файлы cookie, механизм проверки не будет использоваться.

FormsAuthentication.SetAuthCookie: Создает билет проверки подлинности для предоставленного имени пользователя и добавляет его в коллекцию cookie ответа, используя предоставленный путь к файлам cookie.или используя URL, если вы используете аутентификацию без файлов cookie.

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

Если я установлю точку останова в функции RedirectFromLoginPage и протестирую некоторые значения, я получу:

bool cookieSupport = Request.Browser.Cookies; //"true"
bool redirectWithCookies = Request.Browser.SupportsRedirectWithCookie; //"true"
HttpCookieMode currentMode = FormsAuthentication.CookieMode; //"AutoDetect"

Я не уверен, если Request.Browser.Cookiesподразумевается, чтобы быть правдой или нет здесь.Браузер поддерживает файлы cookie, но все они заблокированы ...

В любом случае, я несколько минут добирался до удаленного компьютера, на котором возникла проблема.Настройки конфиденциальности были установлены на средний, поэтому он мог принимать куки.Это была стандартная установка Win7 / IE8.Я попытался добавить сайт в доверенную зону пользователя, чтобы войти через https, но это не сработало.Другие проблемы были похожи (на машинах ничего не выделяется, и пользователи говорят мне, что у них нет проблем на других сайтах)

Так что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 19 апреля 2012

Подобная проблема произошла для меня. Но это было только для Internet Explorer 8. После некоторых исследований я понял, что IE8 по умолчанию работает в безударном режиме. Итак, я изменил эту строку в web.config: <forms loginUrl="..." timeout="180" cookieless="AutoDetect"/> до <forms loginUrl="..." timeout="180" cookieless="UseUri"/>, и работает нормально.

1 голос
/ 05 мая 2011

Указываете ли вы домен для файла cookie аутентификации форм в файле web.config? И соответствует ли он домену для сайта?

Я считаю, что Средние настройки безопасности в IE блокируют сторонние файлы cookie, поэтому проблема может заключаться в том, что IE считает ваш файл cookie аутентификации сторонним файлом cookie.

...