24

ユーザーが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などで今より良い方法はありますか?

これを行うためのより良い方法がない場合、このクラッジは信頼できますか?それをより堅牢にする方法はありますか?

4

1 に答える 1

5

短い答えは次のとおり
です。基本認証の現在の実装を考えると、HTTP 基本認証またはダイジェスト認証を使用して「ログオフ」を達成するための信頼できる手順はありません。

このような認証は、クライアントにAuthorizationヘッダーをリクエストに追加させることで機能します。
特定のリソースについて、サーバーが提供された資格情報に満足していない場合 (たとえば、何もない場合)、サーバーは "401 Unauthorized" ステータス コードで応答し、認証を要求します。そのために、応答とともにWWW-Authenticateヘッダーを提供します。

クライアントは、サーバーが認証を要求するのを待つ必要はありません。いくつかのローカルな仮定 (たとえば、最後に成功した試行からのキャッシュされた情報) に基づいて、単純にAuthorizationヘッダーを提供する場合があります。

認証情報を「消去」する上で概説したアプローチは、幅広いクライアント (つまり、普及しているブラウザー) で動作する可能性が高いですが、別のクライアントが「よりスマート」であり、適切な認証データを単純に識別するという保証はまったくありません。あなたの「ログアウト」ページとターゲットサイトの他のページ。

クライアント側の証明書ベースの認証を使用すると、同様の「問題」が発生することがわかります。クライアントからの明示的なサポートがない限り、失われた地面で戦う可能性があります.

そのため、「ログオフ」が懸念される場合は、任意のセッション ベースの認証に移行してください。

サーバー側で認証の実装にアクセスできる場合は、アプリケーションレベルのコードの要求に応じて、 Authorizationヘッダーで提示された認証情報を無視する機能を実装できる可能性があります(現在の「セッション中に提示されたものと同じ場合)」 (または、資格情報が再要求されるまでの「タイムアウト」を提供します)。これにより、クライアントはユーザーに「新しい」資格情報を提供する (新しいログインを実行する) ように求めます。

于 2016-03-02T13:58:18.327 に答える