Я хочу, чтобы пользователи могли входить через обычные режимы аутентификации 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 и т. Д.?
Если нет лучшего способа сделать это, можно ли положиться на этот обломок?Есть ли способ сделать его более надежным?