Срок действия файлов cookie ASP.NET всегда 1 января 2001 года в 12:00. - PullRequest
26 голосов
/ 13 октября 2008

Я устанавливаю срок действия куки, используя следующий код:


// 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 на другой странице, я получаю 01.01.01 00:00. Если кто-то может помочь мне разобраться в проблеме, я это ценю. Я использую ASP.NET 3.5

ки. после прочтения ссылок от Gulzar выясняется, что я не могу проверить cookie. Истекает ли вообще HttpRequest? Поскольку ссылки, кажется, предполагают, что cookie.Expires всегда установлен в DateTime.MinValue, потому что сервер никогда не может знать фактическое время на клиентском компьютере? Значит, я должен сам хранить время в куки и проверять его? Правильно ли мое понимание?

спасибо Шанкар

Ответы [ 6 ]

59 голосов
/ 20 января 2009

Проблема здесь на самом деле не в ASP.NET, а в количестве информации, предоставляемой браузером в запросе http. Дата истечения срока действия будет недоступна независимо от платформы, которую вы используете на стороне сервера.

Как вы подытожили в своем вопросе, свойство Expires объекта HttpCookie, предоставляемого объектом HttpRequest, всегда установлено на 01.01.01 00:00. Это связано с тем, что эта информация об истечении срока действия, а также такие свойства, как домен и путь, не передаются браузером на сервер при отправке запроса. Единственная отправляемая информация о файлах cookie - это имя и значение. Поэтому куки в запросе будут иметь значения по умолчанию для этих «пропущенных» полей, поскольку они неизвестны на стороне сервера.

Я полагаю, что причина этого в том, что атрибуты cookie, имеющие срок действия, домен и путь, предназначены для использования браузером только при принятии решения о том, должен ли он передавать cookie в запросе или нет и что сервер интересуется только именем и значением (ями).

Обходной путь, который вы предложили дублировать время истечения, поскольку другое значение cookie - это способ получить поведение, которое вы ищете.

4 голосов
/ 08 октября 2009

Сначала я также разочарован, почему в Cookie-запросе нет действительного значения Expires. После отладки http с помощью Fiddler2. Я знаю, что .NET не ошибся, вместо этого протокол http - это ответ, почему запрос куки-файлов ведет себя так.

Если вы используете Fiddler между вашим приложением и браузером. Вы можете видеть, что cookie-файл ответа отправляется в браузер правильно со всеми доменом, путем, сроком действия, безопасным и httponly. Однако следующий файл cookie cookie в заголовке файла cookie http не имеет значения expires, он содержит только имя и значение cookie. Браузер отвечает за отправку этого заголовка запроса, и я считаю, что это потому, что протокол HTTP. Причина в том, что для минимизации размера веб-серверу не нужно проверять его, поскольку они фактически устанавливают все значения. Они должны заметить.

Так что вам не нужно проверять значение expires по веб-запросу, так как вы уже знаете дату. Просто, если вы получаете cookie обратно, это означает, что срок действия cookie еще не истек. Как только вы установите срок действия, браузер будет обрабатывать истечение срока. Если вы хотите изменить срок действия, просто установите новое значение в ответе.

CallMeLaNN

2 голосов
/ 13 октября 2008

Какую версию asp.net вы используете? Это обсуждалось на форуме asp.net .

1 голос
/ 08 августа 2015

Чтобы решить эту проблему, я добавляю претензию к принципалу, которую затем могу прочитать, и показываю пользователю время истечения срока действия куки:

    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();
0 голосов
/ 09 января 2013

У меня была похожая проблема при тестировании с Iphone. Проблема была из-за того, что Iphone установил неверное время на устройстве, поэтому установка даты истечения срока действия файла cookie на datetime.now.adddays (-1) не истек срок действия файла cookie

0 голосов
/ 02 января 2009

Проблема версии, обсуждаемая в ссылке, оказалась бесполезной. В основном ASP.NET cookie отстой. Мне пришлось хранить время истечения срока действия внутри куки и проверять его при каждом запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...