Ответ 1
Какую версию asp.net вы используете? Это обсуждалось в форуме asp.net.
Я устанавливаю срок действия файла 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 и проверить его? Правильно ли я понимаю?
спасибо Шанкар
Какую версию asp.net вы используете? Это обсуждалось в форуме asp.net.
Проблема здесь не связана с ASP.NET, но с объемом информации, которая предоставляется в HTTP-запросе браузерами. Дата истечения срока действия будет недоступна независимо от платформы, которую вы используете на стороне сервера.
Как вы суммировали себя в своем вопросе, свойство Expires объекта HttpCookie, предоставляемое объектом HttpRequest, всегда устанавливается на 1/1/0001 12:00. Это связано с тем, что эта информация об истечении срока действия, а также такие свойства, как домен и путь, не передаются браузером на сервер при отправке запроса. Единственная информация о файлах cookie, которая отправляется, - это имя и значение. Поэтому файлы cookie в запросе будут иметь значения по умолчанию для этих "недостающих" полей, поскольку они неизвестны на стороне сервера.
Я бы предположил, что причина в том, что атрибуты истечения срока действия, домена и пути в cookie предназначены только для использования браузером, когда он принимает решение о том, должен ли он передавать cookie в запросе или нет и что сервер интересуется только именем и значением.
Работа вокруг вас предлагает дублировать время истечения срока действия, поскольку другое значение cookie - это способ получить поведение, которое вы ищете.
Вначале я также разочаровал, почему Cookie Request не имеет фактического значения Expires. После отладки http с помощью Fiddler2. Я знаю, что .NET не был неправильным, вместо этого HTTP-протокол является ответом, почему запросы cookie ведут себя так.
Если вы используете Fiddler между вашим приложением и браузером. Вы можете увидеть, что cookie Response правильно отправлен в браузер со всем доменом, путем, истекает, безопасно и httponly. Однако следующий файл cookie запроса в заголовке http cookie не имеет значения expires, это только имя и значение cookie. Браузер отвечает за отправку этого заголовка запроса, и я считаю, что это потому, что протокол http. Причина в том, что для минимизации размера и веб-сервера нет необходимости проверять его, поскольку они фактически устанавливают все значения. Они должны заметить.
Поэтому вам не нужно проверять значение expires в веб-запросе, так как вы уже знаете дату. Просто, если вы получите файл cookie, который означает, что cookie еще не истек. Как только вы установите срок действия, браузер будет работать с истечением срока действия. Если вы хотите изменить срок действия, просто установите новое значение в ответе.
CallMeLaNN
Проблема версии, обсуждаемая в ссылке, не помогла. В основном ASP.NET cookie отстой. Мне пришлось хранить время истечения срока действия внутри файла cookie и проверять его в каждом запросе.
У меня была аналогичная проблема при тестировании с помощью Iphone. Проблема заключалась в том, что Iphone имел неправильное время, установленное на устройстве, тем самым установив дату истечения срока действия файла cookie в datetime.now.adddays(-1) не истекал срок действия файла cookie
Чтобы решить эту проблему, я добавляю претензию к директору, который затем могу прочитать и отобразить время истечения срока действия 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();