web-dev-qa-db-ja.com

Cookieをセッションの終了時に期限切れに設定しますか? asp.net

答えが見つからなかったことに驚きました。

CookieのセッションIDをセッションの終了時に期限切れになるように設定するにはどうすればよいですか? (ブラウザが閉じたとき、またはユーザーが一定期間非アクティブだったとき)。

私が見つけた2つの解決策は

(httpcookie).Expires = HttpContext.Current.Session.Timeout

これによりコンパイルエラーが発生したため、ユーザーが投稿する前にコードをチェックしたかどうかわかりません。もう1つは、有効期限を1日前に設定することでした。どうすればいいですか?

34
user34537

あなたは非永続的なクッキーについて話している。デフォルトでは、asp.netはその方法でCookieを送信します。それらの主な違いは、永続的なCookieに有効期限値が設定されていることです。

したがって、Cookieを保持したくない場合は、expires値を設定しないでください。

つまり、ブラウザが実際に閉じられるまで、Cookieはメモリに残ります。彼らがあなたのサイトを閲覧し、あなたが非永続的なクッキーを設定したとしましょう。彼らは物事を行い、閲覧します。その後、同じブラウザインスタンスを使用して、サイトに戻ってきます。 Cookieは引き続き存在します。

今、彼らが任意の時点でブラウザを閉じた場合、クッキーは消去されます。

ポイントは、expiresヘッダーを設定しないことです。特に、セッションの日付が切れるときはそうではありません。通常、セッションの日付は20分程度先の未来ですが、ユーザーがサイトを閲覧すると有効期限が繰り越されます。

=====更新=====

テストには次のコードを使用しました。

    protected void Page_Load(object sender, EventArgs e) {
        if (!Page.IsPostBack) {
            HttpCookie c = Request.Cookies["test"];
            if (c != null) {
                Response.Write(String.Format("test value is {0} <br />", c.Value));
            }
        } else {
            HttpCookie c = new HttpCookie("test");
            c.Value = "HERE IT IS";
            Response.Cookies.Add(c);
        }
    }

    protected void Button1_Click(object sender, EventArgs e) {
        Response.Write("clicked<br />");
    }

.aspxファイルsimpleには、そのbutton1_clickハンドラーを起動するボタンがありました。最初に最新のブラウザ(Firefox、Chromeなど)を使用してブラウザを参照したとき、Cookieはありません。ボタンをクリックすると、Cookieが設定されます。その後、ブラウザを完全に閉じ、再度開き、サイトに戻って参照しました。すべての場合において、クッキーはなくなりました。

51
NotMe

最近では、ユーザーがブラウザを閉じたときにセッションCookieが削除されることを期待できないことに注意することが重要です。両方ChromeとFirefoxは2012年頃にその変更を行いました- this answer のさまざまなリンクを参照してください。

現在、セッションCookieの削除に失敗すると、関連するすべてのRFCの違反は言うまでもなく、ひどい、恐ろしい、良くない、非常に悪いセキュリティホールとして私を襲いますが、明らかにGoogle(およびMozilla)の大君主はよく知っています。

最善の回避策が何であるかはわかりませんが、私が取っているアプローチは、Cookieの「Expires」プロパティを各呼び出し後に将来の1時間にリセットすることです。これは必ずしも望ましい動作ではありませんが、重要なCookieを基本的に永久に保持するよりも良いと思います。

他の提案や説明を受け入れます。

9
Ken Smith

TimeOutintを返し、ExpiresDateTimeを期待するため、コードはコンパイルされません。有効期限を過去の日付に設定すると、すぐにCookieが取り消されるので、おそらくそれはあなたが望むものではないでしょう。有効期限を使用しないままにしておくと、ユーザーがブラウザーを閉じるとすぐにCookieが期限切れになります。

Cookieを特定のセッションに関連付けたい場合、そもそもCookieを使用するのはなぜですか?確かに、ユーザーがアプリケーションを使用してセッションを延長するたびに、Cookieの有効期限を延長し続けることはできますが、それは不要な作業のようです。 Sessionを使用してください。

問題について詳しく説明してください。

2
Anthony Pegram

ログインコントロールを使用しないでください。

protected void btnLogin_Click(object sender, EventArgs e) 
{
    // Check user and password in database
    bool isValidUser = ValidateUser(txtUsername.Text, txtPassword.Text);

    // Set cookie to be not persistent - this means if the user closes the browser, 
    //autentification cookie will be deleted and the user is not longer logged 
    bool isPersistentCookie = false;

    // Login user with the new username
    FormsAuthentication.SetAuthCookie(txtUsername.Text, isPersistentCookie);
}
1