2009-03-04 18 views
3

私は、ASP.NET Webアプリケーションのユーザーに対して明示的なログアウトボタンが必要です。私は基本認証(SSL)でIIS6を使用しています。私は別のWebページにリダイレクトすることができますが、ブラウザはセッションを生きています。私は動き回って、アクティブなxコントロールがIISと通信してセッションを終了できるようにすることで、これを行う方法を見つけました。私はフォーム認証を許可しない制限された環境におり、アクティブなxコントロールは禁止されていません。他の誰かがこの要件を持っていて、それをどのように扱っていますか?ログオフボタンIIS6 ASP.NET基本認証

これは私が恐れていたものです。私はネット上で同様の答えを見ていると私は誰かがそれをやる方法を持っていることを望んでいた。あなたの時間をありがとう。私はjavascriptを使用してhistory.back()のような戻るボタンを防ぐことができると思います。

答えて

4

私は数日間、これで自分を苦労しました。 1)それは、例えば、ユーザの意志はまた彼のGmailや彼は現在 を認証されています、他のウェブサイトからログアウトします。つまり、すべての資格情報をフラッシュします。特定のIE「document.execCommand('ClearAuthenticationCache');」を使用して

は、誰にとっても良いオプションではありません2)それはIEのみです;)

私はSession.Abandon()を使用してから、私のDefault.aspxにリダイレクトしようとしました。これだけでは十分ではありません。 作成した要求が許可されていないことをブラウザに明示的に伝える必要があります。あなたは、のようなものを使用してこれを行うことができます。これは、以下になります

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
response.AddHeader("WWW-Authenticate", "BASIC Realm=my application name"); 
resp.End(); 

:ユーザーが==>彼は、基本的なログイン画面を取得するログアウトボタンをクリックします。しかし、エスケープ(ログインダイアログが消える)を押してリフレッシュすると、ブラウザはログアウトしたと思うかもしれませんが、自動的に資格情報を再度送信してユーザーにログインさせます。

これを解決するためのトリックは、常にユニークな「領域」を吐き出すことです。上記の場合、ブラウザは資格情報を再送しません。私は現在の日時を吐き出すことを選んだ。

response.StatusCode = 401; 
response.Status = "401 Unauthorized"; 
string realm = "my application name";     
response.AddHeader("WWW-Authenticate", string.Format(@"BASIC Realm={0} ({1})", realm, DateTimeUtils.ConvertToUIDateTime(DateTime.Now))); 
resp.End(); 

あなたがする必要があるもう一つは、ページをキャッシュしないように、ブラウザを教えてくれている:すべてのこれらの事で

Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetExpires(DateTime.MinValue); 
Response.Cache.SetNoStore(); 

の代わりに、それは(私のために)動作しますIEのが、今までにユーザーが最初にエスケープ(基本的なログインダイアログを隠す)した後、リフレッシュ(F5)またはブラウザの戻るボタンを押したときに、firefoxがユーザーにログインするのを防ぐことができませんでした。

0

ボタンのクリックに応答してSession.Abandonを呼び出してみましたか?

編集

古典的なバックボタンの問題であると思われます。

戻るボタンについてはごくわずかです。ユーザーが新しいウィンドウで現在のページを開いた後、logOutボタンをクリックしたと仮定すると、そのページはログアウトされたように見えますが、すぐに他のウィンドウの内容には影響しません。

そのウィンドウのどこかをナビゲートしようとすると、セッションが終了したことが明らかになります。

多くのブラウザでは、同様の(同じではありませんが)バックボタンが実装されています。前のページに戻ることは、必ずしもHTML/HTTPの視点のナビゲーションではありません。

+0

クリックするとまだ認証されています。 保護されたvoid logOut_Click(オブジェクト送信者、EventArgs e) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect( "http://www.google.org"); } – willyconnor

2

Session.Abandonメソッドは、Sessionオブジェクトに格納されているすべてのオブジェクトを破棄し、リソースを解放します。 Abandonメソッドを明示的に呼び出さないと、サーバーはセッションがタイムアウトするとこれらのオブジェクトを破棄します。

+0

クリックするとまだ認証されています。 保護されたvoid logOut_Click(オブジェクト送信者、EventArgs e) { Session.Clear(); Session.Abandon(); ViewState.Clear(); FormsAuthentication.SignOut(); Response.Redirect( "http://www.google.org"); } – willyconnor

+0

キャッシュされたバージョンのページを表示しているようです。サーバから強制的にリフレッシュしようとすると、セッションの期限が切れていることがわかります。 –

+0

キャッシュを無効にすることもできます。これがどのように達成されるかを説明するいくつかのスタックオーバーフローの質問があります。 –

0

これはIE6以上で動作するこの問題の解決策です。ジェリーB.書き込みを、「ユーザーが検証され、彼の要求を処理した後、私が今欲しい:ショート で http://msdn.microsoft.com/en-us/library/bb250510%28VS.85%29.aspx

ウェブチーム資格情報、ください

Qからこれを見つけた

<asp:LinkButton ID="LinkButton1" runat="server" OnClientClick="logout();">LinkButton</asp:LinkButton> 


<script> 

    function logout() 
    { 
    document.execCommand("ClearAuthenticationCache",false); 
    } 
</script> 

このマシンが誰かが歩き回ることができるオープンな環境にあるとすれば、ユーザーがWeb上の特定のモジュールにアクセスするたびに新たな挑戦をしたいと思っています。

A:これはInternet Explorerチームの頻繁に要求される機能であり、その上の善良なユーザーがInternet Explorer 6.0 SP1で行う方法を提供しています。

document.execCommand("ClearAuthenticationCache"); 

このコマンドは、フラッシュなど、ユーザがそのリソースを要求した場合、そのキャッシュ内のすべての資格情報、:あなたがする必要があるのは、このように、コマンドパラメータとしてClearAuthenticationCacheに渡して、文書にexecCommandメソッドを呼び出しています認証が必要な場合、認証のプロンプトが再度表示されます。

私はログアウトリンクボタンでこれを入れて、それがIE6 SP1と高いに動作します:

OnClientClick="document.execCommand('ClearAuthenticationCache');"