Есть ли браузер, эквивалентный IE ClearAuthenticationCache? - PullRequest
24 голосов
/ 28 августа 2008

У меня есть несколько внутренних веб-приложений .net, которые требуют от пользователей «выхода» из них. Я знаю, что это может показаться спорным для интранет-приложения, но, тем не менее, оно есть.

Мы используем проверку подлинности Windows для наших приложений для интрасети, поэтому мы подключаемся к нашей Active Directory с помощью базовой проверки подлинности, и учетные данные сохраняются в кэше браузера, а не в файле cookie при использовании проверки подлинности с помощью форм .net.

В IE6 + вы можете использовать специальную функцию JavaScript, которую они создали, выполнив следующие действия:

document.execCommand("ClearAuthenticationCache", "false")

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

Кто-нибудь знает некоторые команды / хаки / и т.д. что я могу использовать в других браузерах для очистки кэша аутентификации?

Ответы [ 7 ]

11 голосов
/ 09 июня 2011

Я придумала исправление, которое кажется довольно последовательным, но хакерским и Я все еще не доволен им .

Это работает, хотя: -)

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

6 голосов
/ 25 февраля 2012

Mozilla реализовала крипто-объект, доступный через объект DOM window, который имеет функцию logout (Firefox 1.5 и выше), чтобы очистить состояние сеанса SSL на уровне браузера, чтобы "следующая частная операция на любом токене потребует пароль пользователя снова "(см. this ).

Криптообъект, по-видимому, является реализацией Web Crypto API , и согласно этому документу API DOMCrypt добавит еще больше функций.

Как указано выше, 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";
}
5 голосов
/ 14 декабря 2011

Пара заметок. Несколько человек сказали, что вам нужно запустить 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");

К сожалению, нам нужно пойти на все, чтобы выйти из системы.

2 голосов
/ 10 сентября 2009

Я искал подобное решение и наткнулся на патч для Trac (системы управления проблемами), который делает это.

Я просмотрел код (и я устал, поэтому я не все объясняю); в основном вам нужно сделать AJAX-вызов с гарантированно недействительными учетными данными на вашу страницу входа . Браузер получит 401 и будет знать, что в следующий раз, когда вы туда пойдете, ему нужно будет запросить правильные учетные данные. Вы используете AJAX вместо перенаправления, так что вы можете указать неверные учетные данные, и браузер не отобразит диалоговое окно.

На странице патча (http://trac -hacks.org / wiki / TrueHttpLogoutPatch ) они используют очень элементарный AJAX; что-то лучше, например, jQuery или Prototype и т. д., вероятно, лучше, хотя это и делает работу.

2 голосов
/ 28 августа 2008

Почему бы не использовать FormsAuth, но вместо ActiveDirectory, согласно информации в этой теме . Он так же безопасен (как и), как Basic Auth, но выход из системы - это просто вопрос очистки куки (точнее, вызова FormsAuthentication.SignOut )

0 голосов
/ 28 августа 2008

Что ж, я немного осмотрел Bugzilla, и, похоже, лучший способ очистить аутентификацию - отправить несуществующие учетные данные.

Подробнее здесь: https://bugzilla.mozilla.org/show_bug.cgi?id=287957

0 голосов
/ 28 августа 2008

Надеюсь, это будет полезно, пока кто-то не придет с явным ответом - этот вопрос обсуждался два года назад на доске объявлений .

НТН

...