我正在使用.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过期?
答案 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} )