Подтвердить что ты не робот

Время истечения файла cookie для ASP.NET всегда равно 1/1/0001 12:00 AM

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

CallMeLaNN

Ответ 4

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

Ответ 5

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

Ответ 6

Чтобы решить эту проблему, я добавляю претензию к директору, который затем могу прочитать и отобразить время истечения срока действия 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();