Выход пользователя из системы при использовании HTTP Basic аутентификации - PullRequest
22 голосов
/ 08 июня 2011

Я хочу, чтобы пользователи могли входить через обычные режимы аутентификации HTTP.

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

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

Итак, я нашел обходной путь, но это полный отрыв:

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

2) На этой странице запустить скрипт для ajax загрузки другой страницы с фиктивными учетными данными:

$j.ajax({
    url: '<%:Url.Action("LogOff401", new { id = random })%>',
    type: 'POST',
    username: '<%:random%>',
    password: '<%:random%>',
    success: function () { alert('logged off'); }
});

3) Это должновсегда возвращайте 401 в первый раз (для принудительной передачи новых учетных данных) и затем принимайте только фиктивные учетные данные:

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

Обратите внимание, что мои примеры кода используют jQuery и ASP.Net MVC, но то же самое должно быть возможно слюбой технологический стек.

Есть еще один способ сделать это в IE6 и выше:

document.execCommand("ClearAuthenticationCache");

Однако это очищает всю аутентификацию - они выходят из моего сайта, и ониВы вышли из их электронной почты тоже.Вот и все.

Есть ли лучший способ сделать это?

Я видел другие вопросы по этому вопросу, но им 2 года - есть ли лучший способ для IE9, FX4, Chrome и т. Д.?

Если нет лучшего способа сделать это, можно ли положиться на этот обломок?Есть ли способ сделать его более надежным?

1 Ответ

2 голосов
/ 02 марта 2016

Короткий anser:
Не существует надежной процедуры для достижения "выхода из системы" с использованием базовой аутентификации HTTP или дайджест-проверки подлинности с учетом текущих реализаций базовой аутентификации.

Такая аутентификация работает, когда клиент добавляет Авторизация заголовок запроса.
Если для определенного ресурса сервер не удовлетворен предоставленными учетными данными (например, если их нет), он ответит кодом состояния "401 Неавторизованный" и запросом.аутентификация.Для этого он предоставит ответ WWW-Authenticate с ответом.

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

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

Вы обнаружите похожую «проблему» при использовании аутентификации на основе сертификатов на стороне клиента.Пока нет явной поддержки со стороны клиентов, вы можете бороться на потерянной почве.

Так что, если «выход из системы» является проблемой, переходите к любой сеансовой аутентификации.

Если у вас естьПолучив доступ к реализации аутентификации на стороне сервера, вы можете реализовать функциональность, которая не учитывает информацию аутентификации, представленную с заголовком Авторизация (если она по-прежнему идентична той, что была представлена ​​во время текущей "сессии) по запросу вашегокод уровня приложения (или укажите «тайм-аут», после которого любые учетные данные будут повторно запрашиваться), чтобы клиент запросил у пользователя «новые» учетные данные (выполняя новый вход в систему).

...