ホームページ  >  記事  >  バックエンド開発  >  Asp.net で安全に終了するときにセッションまたは Cookie をクリアするサンプル コード

Asp.net で安全に終了するときにセッションまたは Cookie をクリアするサンプル コード

高洛峰
高洛峰オリジナル
2016-12-10 09:13:261731ブラウズ

概要:

クリックすると、ログイン/終了ページにリダイレクトされるだけの場合は、ブラウザのアドレスバーにホームページなどのログイン後のページのアドレスを入力します。ログインせずにアクセスできます。このいわゆる出口は安全ではありません。

では、安全に脱出するにはどうすればよいでしょうか?

クリックして終了した後、対応するセッションまたは 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 イベントは次のようになります)無効)。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。