.NetCore Cookie无法过期

时间:2019-03-22 18:55:19

标签: asp.net-core cookies

我正在使用.NetCore和Cookie身份验证。帐户管理(登录,注销等)全部通过API进行管理,而不是使用Identity UI。我的理解是服务器实际上无法将任何内容发送到客户端以实际删除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();
 }

但是,当我致电signout时,我的cookie似乎永远不会过期。我在浏览器开发者控制台中注意到,该cookie表示Expires on: Session。我本来希望在那里看到日期/时间。

如何取消cookie或在调用注销时使cookie过期?

1 个答案:

答案 0 :(得分: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();
    }

首先请确保check browser support for this header

如果您的浏览器不支持Clear-Site-Data,那么您应该可以像这样使它们过期:

this.Response.Cookies.Append("cookieName", "deleted", new CookieOptions()
{
   Expires = DateTimeOffset.MinValue
});

此注销响应返回到浏览器后,我可以看到Cookie消失(使用Chrome 73.0.3683.86,开发人员工具/存储/ Cookies / {myDomain}