#asp.net-core #cookies
#asp.net-core #файлы cookie
Вопрос:
Я использую .NETCore и проверку подлинности с использованием файлов cookie. Управление учетными записями (вход в систему, выход из системы и т.д.) Осуществляется через API, В отличие от использования пользовательского интерфейса Identity. Насколько я понимаю, сервер фактически не может отправить клиенту что-либо, чтобы фактически удалить файл cookie, скорее, мне нужно было бы «истечь» срок действия файла cookie на сервере и вернуть его клиенту.
Итак, вот моя настройка
Startup.cs
services.AddAuthentication("mycookie")
.AddCookie("mycookie", options => {
options.Cookie.HttpOnly = true;
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(30);
options.Cookie.Expiration = TimeSpan.FromMinutes(30);
});
В моем ApiController
у меня есть следующее:
AccountController.cs
[HttpGet("signout")]
public async Task<IActionResult> SignOut()
{
var temp = new AuthenticationProperties()
{
ExpiresUtc = DateTime.Now.AddDays(-1)
}
await HttpContext.SignOutAsync("mycookie",temp);
return Ok();
}
Однако, кажется, что срок действия моего файла cookie никогда не истекает при вызове signout
. Я заметил в консоли разработчика браузера, что в файле cookie указано Expires on: Session
. Я бы ожидал увидеть там дату / время.
Как мне избавиться от файла cookie или истечь срок его действия при вызове выхода из системы?
Ответ №1:
используйте заголовок ответа Clear-Site-Data. Помимо прочего, это позволяет вам удалять файлы cookie в браузере клиента.
В моем примере ниже я очищаю кэш пользователя и файлы cookie для моего домена.
public IActionResult Logout()
{
this.HttpContext.Response.Headers.Add("Clear-Site-Data", new StringValues(new string[] { ""cache"", ""cookies"" }));
return Ok();
}
Сначала не забудьте проверить поддержку браузера для этого заголовка.
Если ваш браузер не поддерживает Clear-Site-Data, то вы должны иметь возможность истечь для них следующим образом:
this.Response.Cookies.Append("cookieName", "deleted", new CookieOptions()
{
Expires = DateTimeOffset.MinValue
});
Когда этот ответ на выход из системы возвращается в браузер, я могу видеть, что файлы cookie исчезают (используя Chrome 73.0.3683.86, Инструменты разработчика / Хранилище / Файлы cookie / {myDomain} )
Комментарии:
1. Похоже, это не работает. Я использую последнюю версию FireFox
2. Я только что протестировал его в последней версии FireFox (66.0.1), и он отлично работает. Убедитесь, что вы передаете значение «»cookies «», а не «cookies». Также обратите внимание, что при этом будут удалены только файлы cookie, домен которых соответствует источнику URL-адреса ответа.
3. Вы правы, это работает — и я идиот. Понял, что мое действие никогда не вызывалось, потому что у меня был
[HttpPost]
атрибут и я вызывал сGET
. Ого!4. Кстати, я обнаружил, что как только я вызывал действие с правильным протоколом,
SignOutAsync()
вызова было достаточно для выхода из системы — на самом деле мне не нужны были дополнительные HTTP-заголовки или значение истечения срока действия