概要:
クリックすると、ログイン/終了ページにリダイレクトされるだけの場合は、ブラウザのアドレスバーにホームページなどのログイン後のページのアドレスを入力します。ログインせずにアクセスできます。このいわゆる出口は安全ではありません。
では、安全に脱出するにはどうすればよいでしょうか?
クリックして終了した後、対応するセッションまたは Cookie をクリアします。
セッションをクリアするコード:
Session.Clear(); Session.Abandon();
Cookie をクリアする正しいコード (Cookie 名が UserInfo であると仮定):
if (Request.Cookies["UserInfo"] != null) { Response.Cookies["UserInfo"].Expires = DateTime.Now.AddDays(-1); }
すべての Cookie をクリアする必要がある場合は、次をトラバースします:
for (int i = 0; i <Response.Cookies.Count; i++) { Response.Cookies[i].Expires = DateTime.Now.AddDays(-1); }
Cookie クリアのエラー コード (Cookie 名が UserInfo であると仮定):
if (Request.Cookies["UserInfo"] != null) { Response.Cookies.Remove("UserInfo"); }この処理後も Cookie がまだ存在していることがわかりますが、なぜ削除できないのでしょうか? .NET の HttpCookieCollection 実装ソース コードを見てみましょう。
public void Remove(string name) { if (this._response != null) { this._response.BeforeCookieCollectionChange(); } this.RemoveCookie(name); if (this._response != null) { this._response.OnCookieCollectionChange(); } }この操作では、サーバーがクライアントにデータを送信するときに、サーバー上で削除された Cookie は含まれません。ブラウザは Cookie 内の情報を変更しません (remove メソッドはサーバーが削除された Cookie をクライアントに送信しないようにするだけであり、Cookie がクライアントに残るかどうかとは関係ありません)。そのため、Cookieを削除できない場合がございます。 Response.Cookies.Remove では必要な効果が得られないのに、なぜ Microsoft はまだそれを保持しているのでしょうか? CookieCollection は ICollection インターフェイスを実装しているため、実用的な価値はほとんどありませんが、romove は実装する必要があるメソッドです。コレクション romove もこの方法で実装されるはずですが、Microsoft が MSDN を書いたとき、その記述があまりにも不明確で、非常に苦労しました。 以下は、安全な終了を実現するためのいくつかの方法の概要です: 1) Linkbutton や Button などのサーバー コントロールを使用して終了を実装します この方法が最適です: 対応するイベントでセッションまたは Cookie をクリアするために直接書き込みます。サーバーコントロールへのコードはこれだけで十分です。 2) ログアウトするには、3499910bf9dac5ae3c52d5ede7383485Logout5db79b134e9f6b82c0b36e0489ee08ed などの HTML タグを使用します。特殊なタグ 3499910bf9dac5ae3c52d5ede73834855db79b134e9f6b82c0b36e0489ee08ed の場合は、次のように実装できます。 "logout.aspx ">Logout5db79b134e9f6b82c0b36e0489ee08ed の場合は、logout.aspx の Page_Load イベントでセッションまたは Cookie をクリアするコードを記述するだけです。 3499910bf9dac5ae3c52d5ede73834855db79b134e9f6b82c0b36e0489ee08ed などの HTML タグの場合、HTML タグの対応するクライアント イベントで Js-Ajax または jQuery-Ajax を使用して、一般ハンドラー (.ashx) のセッションまたは Cookie をクリアできます。コードを書くだけです。 3499910bf9dac5ae3c52d5ede73834855db79b134e9f6b82c0b36e0489ee08ed などの HTML タグの場合は、ボタンなどのサーバー コントロールを現在のページに追加し、div に含めて非表示にすることもできます (注: 非表示は非表示ではありません)。これは、サーバー属性 Visible =False を使用して行うことはできません。div の display:none; を設定することによってのみ実現できます。ボタンのサーバー イベント Cilck でセッションまたは Cookie をクリアするコードを記述します。 HTML マークの対応するクライアント イベントで Button コントロールの Click を呼び出すには、このイベントだけで十分です (サーバー プロパティ Visible=False を通じて Button を非表示に設定すると、JS または jQuery によって呼び出される Button コントロールの Click イベントは次のようになります)無効)。