ユーザーが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.NetMVCを使用していますが、どのテクノロジスタックでも同じことが可能であることに注意してください。
IE6以降でこれを行う別の方法があります。
document.execCommand("ClearAuthenticationCache");
ただし、これですべての認証がクリアされます。彼らは私のサイトからログアウトし、電子メールからもログアウトします。これで終わりです。
これを行うためのより良い方法はありますか?
私はこれについて他の 質問を見ましたが、彼らは2歳です-IE9、FX4、Chromeなどで今より良い方法はありますか?
これを行うためのより良い方法がない場合、このクラッジは信頼できますか?それをより堅牢にする方法はありますか?