В приложении с проверкой подлинности на основе форм у меня есть стандартный элемент управления 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, но это не сработало.Другие проблемы были похожи (на машинах ничего не выделяется, и пользователи говорят мне, что у них нет проблем на других сайтах)
Так что я здесь не так делаю?