概要:
クリックすると、ログイン/終了ページにリダイレクトされるだけの場合は、ブラウザのアドレスバーにホームページなどのログイン後のページのアドレスを入力します。ログインせずにアクセスできます。このいわゆる出口は安全ではありません。
では、安全に脱出するにはどうすればよいでしょうか?
クリックして終了した後、対応するセッションまたは 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) ログアウトするには、
Logout などの HTML タグを使用します。特殊なタグ
の場合は、次のように実装できます。 "logout.aspx ">Logout の場合は、logout.aspx の Page_Load イベントでセッションまたは Cookie をクリアするコードを記述するだけです。
などの HTML タグの場合、HTML タグの対応するクライアント イベントで Js-Ajax または jQuery-Ajax を使用して、一般ハンドラー (.ashx) のセッションまたは Cookie をクリアできます。コードを書くだけです。
などの HTML タグの場合は、ボタンなどのサーバー コントロールを現在のページに追加し、div に含めて非表示にすることもできます (注: 非表示は非表示ではありません)。これは、サーバー属性 Visible =False を使用して行うことはできません。div の display:none; を設定することによってのみ実現できます。ボタンのサーバー イベント Cilck でセッションまたは Cookie をクリアするコードを記述します。 HTML マークの対応するクライアント イベントで Button コントロールの Click を呼び出すには、このイベントだけで十分です (サーバー プロパティ Visible=False を通じて Button を非表示に設定すると、JS または jQuery によって呼び出される Button コントロールの Click イベントは次のようになります)無効)。