Есть ли браузер, эквивалентный IE ClearAuthenticationCache?
У меня есть несколько внутренних веб-приложений.net, которые требуют от пользователей "выхода" из них. Я знаю, что это может показаться спорным для интранет-приложения, но, тем не менее, оно есть.
Мы используем проверку подлинности Windows для наших приложений в интрасети, поэтому мы привязываемся к нашей Active Directory с помощью базовой проверки подлинности, и учетные данные сохраняются в кэше браузера, а не в файле cookie при использовании проверки подлинности с помощью форм.net.
В IE6+ вы можете использовать специальную функцию JavaScript, которую они создали, выполнив следующие действия:
document.execCommand("ClearAuthenticationCache", "false")
Тем не менее, для других браузеров, которые должны поддерживаться (а именно, Firefox на данный момент, но я стремлюсь к поддержке нескольких браузеров), я просто отображаю сообщение пользователю, что ему необходимо закрыть свой браузер, чтобы выйти из приложения, что эффективно очищает кеш приложения
Кто-нибудь знает некоторые команды / хаки / и т.д. что я могу использовать в других браузерах для очистки кэша аутентификации?
7 ответов
Я придумал исправление, которое кажется довольно последовательным, но хакерским, и я все еще не доволен им.
Это работает, хотя:-)
1) Перенаправить их на страницу выхода
2) На этой странице запустите скрипт для ajax, загрузите другую страницу с фиктивными учетными данными (пример в jQuery):
$j.ajax({
url: '<%:Url.Action("LogOff401", new { id = random })%>',
type: 'POST',
username: '<%:random%>',
password: '<%:random%>',
success: function () { alert('logged off'); }
});
3) Это всегда должно возвращать 401 в первый раз (для принудительной передачи новых учетных данных), а затем принимать только фиктивные учетные данные (пример в MVC):
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOff401(string id)
{
// if we've been passed HTTP authorisation
string httpAuth = this.Request.Headers["Authorization"];
if (!string.IsNullOrEmpty(httpAuth) &&
httpAuth.StartsWith("basic", StringComparison.OrdinalIgnoreCase))
{
// build the string we expect - don't allow regular users to pass
byte[] enc = Encoding.UTF8.GetBytes(id + ':' + id);
string expected = "basic " + Convert.ToBase64String(enc);
if (string.Equals(httpAuth, expected, StringComparison.OrdinalIgnoreCase))
{
return Content("You are logged out.");
}
}
// return a request for an HTTP basic auth token, this will cause XmlHttp to pass the new header
this.Response.StatusCode = 401;
this.Response.StatusDescription = "Unauthorized";
this.Response.AppendHeader("WWW-Authenticate", "basic realm=\"My Realm\"");
return Content("Force AJAX component to sent header");
}
4) Теперь учетные данные случайной строки были приняты и кэшированы браузером. Когда они посещают другую страницу, она пытается их использовать, терпит неудачу, а затем запрашивает правильные.
Пара заметок. Несколько человек сказали, что вам нужно запустить ajax-запрос с недействительными учетными данными, чтобы браузер удалил свои собственные учетные данные.
Это правда, но, как указал Кит, важно, чтобы страница сервера утверждала, что принимает эти учетные данные, чтобы этот метод работал согласованно.
На аналогичном замечании: для вашей страницы недостаточно просто вызвать диалог входа в систему с ошибкой 401. Если пользователь выходит из диалогового окна, его кэшированные учетные данные также не затрагиваются.
Также, если вы можете ткнуть MOZILLA в https://bugzilla.mozilla.org/show_bug.cgi?id=287957 чтобы добавить правильное исправление для FireFox. Ошибка веб-набора была зарегистрирована по адресу https://bugs.webkit.org/show_bug.cgi?id=44823. IE реализует плохое, но функциональное решение с помощью метода:
document.execCommand("ClearAuthenticationCache", "false");
К сожалению, нам нужно пойти на это, чтобы выйти из системы.
Mozilla реализовала крипто-объект, доступный через DOM window
объект, который имеет logout
функция (Firefox 1.5 и выше), чтобы очистить состояние сеанса SSL на уровне браузера, чтобы "для следующей частной операции с любым токеном снова потребовался пароль пользователя" (см. это).
Криптообъект, по-видимому, является реализацией Web Crypto API, и согласно этому документу, DOMCrypt API добавит еще больше функций.
Как указано выше, Microsoft IE (6 и выше) имеет: document.execCommand("ClearAuthenticationCache", "false")
Я не нашел способа очистки кэша SLL в Chrome (см. Этот и этот сообщения об ошибках).
В случае, если браузер не предлагает никакого API для этого, я думаю, что лучшее, что мы можем сделать, - это дать пользователю команду закрыть браузер.
Вот что я делаю:
var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") !== -1) {
document.execCommand("ClearAuthenticationCache","false");
}
//window.crypto is defined in Chrome, but it has no logout function
else if (window.crypto && typeof window.crypto.logout === "function"){
window.crypto.logout();
}
else{
window.location = "/page/to/instruct/the/user/to/close/the/browser";
}
Я искал подобное решение и наткнулся на патч для Trac (системы управления проблемами), который делает это.
Я просмотрел код (и я устал, поэтому я не все объясняю); в основном вам нужно сделать вызов AJAX с гарантированно неверными учетными данными на вашей странице входа в систему. Браузер получит 401 и будет знать, что в следующий раз, когда вы пойдете туда, вам нужно будет запросить правильные учетные данные. Вы используете AJAX вместо перенаправления, так что вы можете указать неверные учетные данные, и браузер не отобразит диалоговое окно.
На странице патча ( http://trac-hacks.org/wiki/TrueHttpLogoutPatch) они используют очень элементарный AJAX; что-то лучше, например, jQuery, Prototype и т. д., вероятно, лучше, хотя это и делает свою работу.
Почему бы не использовать FormsAuth, но вместо ActiveDirectory вместо этого в соответствии с информацией в этой теме. Он так же безопасен (как и) как Basic Auth, но выход из системы - это просто вопрос очистки куки (или, скорее, вызова FormsAuthentication.SignOut)
Что ж, я немного осмотрел Bugzilla и, похоже, лучший способ очистить аутентификацию - отправить несуществующие учетные данные.
Подробнее читайте здесь: https://bugzilla.mozilla.org/show_bug.cgi?id=287957
Надеюсь, это будет полезно, пока кто-то не придет с явным ответом - этот вопрос обсуждался два года назад на доске объявлений.
НТН