31

次のコードを使用して、Cookie の有効期限を設定しています。


// remove existing cookies.
request.Cookies.Clear();
response.Cookies.Clear();

// ... serialize and encrypt my data ...

// now set the cookie.
HttpCookie cookie = new HttpCookie(AuthCookieName, encrypted);
cookie.Expires = DateTime.Now.Add(TimeSpan.FromHours(CookieTimeOutHours));
cookie.HttpOnly = true;
response.Cookies.Add(cookie);

// redirect to different page

他のページで Cookie タイムアウトを読むと、0001/1/1 12:00 AM になっています。誰かが私が問題を理解するのを手伝ってくれるなら、私はそれを感謝します. ASP.NET 3.5 を使用しています

わかった。Gulzar からのリンクを読んだ後、HttpRequest で cookie.Expires をまったくチェックできないようです。サーバーはクライアントマシンの実際の時間を知ることができないため、リンクは cookie.Expires が常に DateTime.MinValue に設定されていることを示唆しているように見えるためですか? これは、自分で時間を Cookie に保存して確認する必要があることを意味しますか? 私の理解は正しいですか?

ありがとうシャンカール

4

6 に答える 6

66

ここでの問題は実際には ASP.NET にあるのではなく、ブラウザが http 要求で提供する情報の量にあります。サーバー側で使用しているプラ​​ットフォームに関係なく、有効期限は取得できません。

質問で要約したように、HttpRequest オブジェクトによって提供される HttpCookie オブジェクトの Expires プロパティは、常に 1/1/0001 12:00 AM に設定されます。これは、ドメインやパスなどのプロパティだけでなく、この有効期限情報も、ブラウザがリクエストを送信するときにサーバーに渡されないためです。送信される Cookie 情報は、名前と値のみです。したがって、リクエスト内の Cookie には、サーバー側では不明な「欠落」フィールドのデフォルト値が含まれます。

この背後にある理由は、Cookie の有効期限、ドメイン、およびパス属性は、ブラウザーが要求で Cookie を渡すかどうかを決定するときにのみ使用することを意図しているためであり、サーバーは名前と値のみに関心があります。

Cookie の別の値は、探している動作を取得する方法であるため、有効期限を複製することを提案した回避策です。

于 2009-01-20T11:51:11.697 に答える
5

最初は、Request Cookie に実際の Expires 値がない理由にもがっかりしました。Fiddler2 を使用して http をデバッグした後。.NET が間違っていなかったことはわかっています。代わりに、http プロトコルが、リクエスト Cookie がそのように動作する理由の答えです。

アプリとブラウザーの間で Fiddler を使用する場合。すべてのドメイン、パス、有効期限、セキュア、および httponly を使用して、ブラウザーに正しく送信された応答 Cookie を確認できます。ただし、http cookie ヘッダーの次の Request cookie には有効期限の値がなく、cookie の名前と値のみです。このリクエストヘッダーを送信する責任があるブラウザは、httpプロトコルが原因だと思います。その理由は、サイズを最小化するためであり、Web サーバーは実際にすべての値を設定するため、チェックする必要がないからです。彼らは気付くはずです。

したがって、日付はすでにわかっているため、Web リクエストで有効期限の値を確認する必要はありません。Cookie を受け取った場合、それは Cookie がまだ期限切れになっていないことを意味します。有効期限を設定すると、ブラウザが有効期限を処理します。有効期限を変更する場合は、応答に新しい値を設定するだけです。

CallMeLaNN

于 2009-10-08T15:56:28.840 に答える
2

この問題を解決するために、次のようにプリンシパルにクレームを追加します。これを読み取って、Cookie の有効期限をユーザーに表示できます。

    public static void Configuration(IAppBuilder app)
    {

        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString(string.Format("~/Login.aspx"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SetExpiryClaim 
            }
        });

        app.MapSignalR();
    }


    private static Task SetExpiryClaim(CookieValidateIdentityContext context)
    {
        var contextExpireUtc = context.Properties.ExpiresUtc;

        var claimTypeName = "contextExpireUtc";
        var identity = context.Identity;

        Claim contextExpiryClaim;

        if (identity.HasClaim(c => c.Type == claimTypeName))
        {
            contextExpiryClaim = identity.FindFirst(claimTypeName);
            identity.RemoveClaim(contextExpiryClaim);
        }
        contextExpiryClaim = new Claim(claimTypeName, contextExpireUtc.ToString());
        context.Identity.AddClaim(contextExpiryClaim);

        return Task.FromResult(true);
    }

その後、後で ClaimsPrinciple から有効期限を取得できます。

    ClaimsPrincipal principle = Thread.CurrentPrincipal as ClaimsPrincipal;
    DateTime contextExpiry = principle.Claims.First(p => p.Type == "contextExpireUtc").Value.AsDateTime();
于 2015-08-08T04:53:06.073 に答える
0

リンクで説明されているバージョンの問題は役に立ちませんでした。基本的に、ASP.NETのCookieは最悪です。有効期限を自分でCookie内に保存し、すべてのリクエストで確認する必要がありました。

于 2009-01-02T06:54:05.437 に答える
0

Iphone でテストしたときに、同様の問題が発生しました。この問題は、iPhone のデバイスに間違った日時が設定されていたため、Cookie の有効期限を datetime.now.adddays(-1) に設定しても Cookie が期限切れにならなかったことが原因でした。

于 2013-01-09T14:45:30.417 に答える