Выход пользователя из системы при использовании базовой аутентификации HTTP

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

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

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

Итак, я придумал обходной путь, но это полная путаница:

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 и т. Д.?

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

23
задан Community 23 May 2017 в 11:48
поделиться