27

ここには、ユーザーが「ログアウト」する必要がある内部 .net Web アプリケーションがいくつかあります。これはイントラネット アプリケーションでは意味がないように思えるかもしれませんが、それでも存在します。

イントラネット アプリに Windows 認証を使用しているため、.net フォーム認証を使用する場合は Cookie ではなく、基本認証を使用して Active Directory に接続し、資格情報をブラウザー キャッシュに保存します。

IE6+ では、次のようにして作成された特別な JavaScript 関数を利用できます。

document.execCommand("ClearAuthenticationCache", "false")

ただし、サポートされる他のブラウザー (現時点では Firefox ですが、マルチブラウザーのサポートに努めています) については、アプリケーションからログアウトするにはブラウザーを閉じる必要があるというメッセージをユーザーに表示するだけです。アプリケーションキャッシュを効果的にフラッシュします。

いくつかのコマンド/ハック/などを知っている人はいますか? 他のブラウザで認証キャッシュをフラッシュするために使用できるものですか?

4

7 に答える 7

13

私はかなり一貫しているように見えますが、ハッキーであり、それでも満足していない修正を思いつきました。

それでも動作します:-)

1)ログオフページにリダイレクトします

2)そのページでスクリプトを起動して、ダミーのクレデンシャル(jQueryのサンプル)を使用して別のページをajaxロードします。

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

3)最初は常に401を返し(新しいクレデンシャルを強制的に渡すため)、その後はダミーのクレデンシャルのみを受け入れる必要があります(MVCのサンプル)。

[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)これで、ランダムな文字列のクレデンシャルが受け入れられ、代わりにブラウザによってキャッシュされました。彼らが別のページにアクセスすると、それらを使用しようとし、失敗してから、適切なページの入力を求めます。

于 2011-06-09T07:49:17.067 に答える
7

Mozillaは、DOMwindowオブジェクトを介して利用できるcryptoオブジェクトを実装しました。このオブジェクトlogoutは、ブラウザレベルでSSLセッション状態をクリアする機能(Firefox 1.5以降)を備えているため、「トークンに対する次のプライベート操作では、ユーザーパスワードが再度必要になります」(を参照)。this)。

暗号オブジェクトはWebCryptoAPIの実装のようであり、このドキュメントによると、DOMCryptAPIはさらに多くの機能を追加します。

上記のように、Microsoft IE(6以上)には次のものがあります。 document.execCommand("ClearAuthenticationCache", "false")

ChromeでSLLキャッシュをクリアする方法が見つかりませんでした(これこのバグレポートを参照してください)。

ブラウザがこれを行うためのAPIを提供していない場合は、ブラウザを閉じるようにユーザーに指示する方がよいと思います。

これが私がすることです:

var agt=navigator.userAgent.toLowerCase();
if (agt.indexOf("msie") !== -1) {
    document.execCommand("ClearAuthenticationCache","false");
}
//window.crypto is defined in Chrome, but it has no logout function
else if (window.crypto && typeof window.crypto.logout === "function"){
    window.crypto.logout();
}
else{
    window.location = "/page/to/instruct/the/user/to/close/the/browser";
}
于 2012-02-25T12:29:02.193 に答える
7

いくつかのメモ。ブラウザーに独自の資格情報をドロップさせるには、無効な資格情報を使用して ajax リクエストを送信する必要があると言う人もいます。

これは事実ですが、Keith が指摘したように、このメソッドが一貫して機能するためには、サーバー ページがこれらの資格情報を受け入れると主張することが不可欠です。

同様に、ページが 401 エラーを介してログイン ダイアログを表示するだけでは十分ではありません。ユーザーがダイアログをキャンセルしても、キャッシュされた資格情報は影響を受けません。

また、 https: //bugzilla.mozilla.org/show_bug.cgi?id=287957 で MOZILLA を突いて、FireFox の適切な修正を追加してください。Webkit のバグがhttps://bugs.webkit.org/show_bug.cgi?id=44823に記録されました。IE は、次のメソッドを使用して貧弱ですが機能的なソリューションを実装します。

document.execCommand("ClearAuthenticationCache", "false");

ユーザーをログアウトするためだけに、これほどまでに手間がかかるのは残念です。

于 2011-12-13T23:39:25.023 に答える
3

私は同様の解決策を探していて、これを行う Trac (問題管理システム) のパッチを見つけました。

私はコードに目を通しました (疲れているので、すべてを説明しているわけではありません)。基本的に、ログインページに対して無効な資格情報が保証された AJAX 呼び出しを行う必要があります。ブラウザは 401 を取得し、次にアクセスしたときに正しい認証情報を要求する必要があることを認識します。リダイレクトの代わりに AJAX を使用して、誤った資格情報を指定でき、ブラウザーがダイアログをポップアップしないようにします。

パッチ ( http://trac-hacks.org/wiki/TrueHttpLogoutPatch ) ページでは、非常に初歩的な AJAX を使用しています。jQuery や Prototype などのより優れたものの方がおそらく優れていますが、これで作業は完了します。

于 2009-09-10T19:03:57.357 に答える
2

このスレッドの情報に従って、代わりに FormsAuth を使用せずに ActiveDirectory に対して使用しないのはなぜですか。基本認証と同じくらい安全ですが、ログアウトは単に Cookie を消去するだけです (または、FormsAuthentication.SignOutを呼び出します) 。

于 2008-08-28T00:10:25.833 に答える
0

さて、私はしばらくの間 Bugzilla をブラウジングしてきましたが、認証をクリアするための最善の方法は、存在しない資格情報を送信することです。

詳細はこちら: https://bugzilla.mozilla.org/show_bug.cgi?id=287957

于 2008-08-27T23:44:54.553 に答える
-1

誰かが実際に明確な答えを出すまで、これが役立つことを願っています。この問題は 2 年前に掲示板で議論されました

HTH

于 2008-08-27T23:41:07.353 に答える