web-dev-qa-db-ja.com

asp.net mvc 3およびc#を使用してCookieをクリアするにはどうすればよいですか?

わかりましたので、私は本当にこれを正しくしていると思いますが、クッキーはクリアされていません。

 Session.Clear();
 HttpCookie c = Request.Cookies["MyCookie"];
 if (c != null)
 {
     c = new HttpCookie("MyCookie");
     c["AT"] = null;
     c.Expires = DateTime.Now.AddDays(-1);
     Request.Cookies.Add(c);
 }

 return RedirectToAction("Index", "Home");

リダイレクトが発生すると、再びCookieが検出され、ログアウトしたことがないかのように進みます。何かご意見は?

54
David

あなたは近いです。 Responseオブジェクトを使用して、ブラウザーに書き戻す必要があります。

if ( Request.Cookies["MyCookie"] != null )
{
    var c = new HttpCookie( "MyCookie" );
    c.Expires = DateTime.Now.AddDays( -1 );
    Response.Cookies.Add( c );
}

MSDNの詳細情報 方法:Cookieを削除する

104
Metro Smurf

Cookieはサーバーではなくクライアントに保存されるため、Session.Clearは影響しません。また、Request.CookiesはIISによって設定され、ページへのリクエストごとにページに与えられます。そのコレクションからCookieを追加/削除しても何も起こりません。

Response.Cookiesに対して同様のアクションを実行してみてください。これにより、クライアントは古いCookieを新しいCookieで上書きし、期限切れになります。

9
KeithS

私はこれをしましたが、セッションCookieをクリアする(削除しない)ために機能しました:

HttpContext.Response.Cookies.Set(new HttpCookie("cookie_name"){Value = string.Empty});

Metroの応答に基づいて、この拡張メソッドを作成し、任意のコントローラーでコードを再利用できるようにしました。

/// <summary>
/// Deletes a cookie with specified name
/// </summary>
/// <param name="controller">extends the controller</param>
/// <param name="cookieName">cookie name</param>
public static void DeleteCookie(this Controller controller, string cookieName)
{
    if (controller.HttpContext.Request.Cookies[cookieName] == null)
            return; //cookie doesn't exist

    var c = new HttpCookie(cookieName)
                {
                    Expires = DateTime.Now.AddDays(-1)
                };
    controller.HttpContext.Response.Cookies.Add(c);
}
4
Alex