Не удается истечь для файла cookie .NETCore

#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-заголовки или значение истечения срока действия