Есть ли браузер, эквивалентный IE ClearAuthenticationCache?

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

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

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

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

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

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

Ответ 1

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

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

1) Перенаправить их на страницу выхода из системы

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

Ответ 2

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

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

Как указано выше, Microsoft IE (6 вверх) имеет: document.execCommand("ClearAuthenticationCache", "false")

Я не нашел способа очистить кэш SLL в Chrome (см. this и этот отчет об ошибках).

Если браузер не предлагает какой-либо 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";
}

Ответ 3

Несколько заметок. Несколько человек сказали, что вам нужно отключить запрос ajax с недопустимыми учетными данными, чтобы заставить браузер оставить свои собственные учетные данные.

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

Аналогичное примечание: НЕ ДОЛЖНО показать, что ваша страница просто открывает диалоговое окно входа в систему с ошибкой 401. Если пользователь выйдет из диалогового окна, то их кэшированные учетные данные также не будут затронуты.

Также, если вы можете запросить MOZILLA на https://bugzilla.mozilla.org/show_bug.cgi?id=287957, чтобы добавить исправление для FireFox. Ошибка webkit была зарегистрирована на https://bugs.webkit.org/show_bug.cgi?id=44823. IE реализует плохое, но функциональное решение с помощью метода:

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

К сожалению, нам нужно идти на эти длины только для выхода из системы.

Ответ 4

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

Ответ 5

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

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

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

Ответ 7

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

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