在 .net core 2.0 中删除 cookies

15

我正在开发一个 .Net Core 2.0 MVC Web 应用程序。有一个需要根据用户角色设置过期时间跨度来操作身份验证 cookie 的需求。在过期时间跨度之后,如果没有任何活动,用户将被注销应用程序。为了实现这一点,我创建了一个过滤器,每当用户与站点进行交互时都会调用该过滤器。在该过滤器中,我基本上读取 cookie 值,将其存储在临时变量中,删除现有的 cookie,并将具有相同键和值的新 cookie 追加到响应中。

var cookieContent = Request.Cookie[key];
Response.Cookies.Delete(key);
Response.Cookies.Append(new cookie with same name and value);

我可以创建一个具有所需到期时间的新 cookie,而且它可以正常工作。我在这里遇到的问题是,Response.Cookies.Delete(key); 不能真正删除 cookie。

Microsoft 文档 表明我们无法从用户的电脑上删除 cookie。那么有没有办法从硬盘中删除 cookie?如果没有,Response.Cookies.Delete(cookie); 的作用是什么?

4个回答

37
在ASP.NET Core中,您可以/应该使用以下方法:
    private void DeleteCookies()
    {
        foreach (var cookie in HttpContext.Request.Cookies)
        {
            Response.Cookies.Delete(cookie.Key);
        }
    }
这个操作在内部发送'Set-Cookie'指令到Http响应头中,以指示浏览器同时使cookie过期并清除其值。

响应头示例:

HTTP/1.1 302 Found
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Server: Microsoft-IIS/10.0
Set-Cookie: Cookie1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; samesite=lax
Set-Cookie: Cookie2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; samesite=lax
Set-Cookie: Cookie3=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; secure; samesite=lax

9

您可以像这样设置cookie的过期时间:

Response.Cookies.Append("cookieName", "", new CookieOptions() {
    Expires = DateTime.Now.AddDays(-1)
});

当浏览器从服务器获取响应时,它会发现名为cookieName的cookie已过期。因此,浏览器将删除该 cookie。

4
var Cookieoption1 = new CookieOptions();
Cookieoption1.Path = HttpContext.Request.PathBase;

foreach (var cookieKey in Request.Cookies.Keys)
{
    HttpContext.Response.Cookies.Delete(cookieKey, Cookieoption1);
}

0

清除响应的Cookies并不会指示浏览器清除Cookie,它仅仅是不将Cookie发送回浏览器。要指示浏览器清除Cookie,您需要告诉它该Cookie已经过期,例如:

public static void Clear(string key)
{
    var httpContext = new HttpContextWrapper(HttpContext.Current);
    _response = httpContext.Response;

    HttpCookie cookie = new HttpCookie(key) 
        { 
            Expires = DateTime.Now.AddDays(-1) // or any other time in the past
        };
    _response.Cookies.Set(cookie);
}

只是补充一点,我也将值作为 null 返回,例如:

 public static void RemoveCookie(string cookieName)
    {
        if (HttpContext.Current.Response.Cookies[cookieName] != null)
        {
            HttpContext.Current.Response.Cookies[cookieName].Value = null;
            HttpContext.Current.Response.Cookies[cookieName].Expires = DateTime.Now.AddMonths(-1);
        }
    }

5
谢谢您的答复,但该解决方案适用于 .net framework 4.6,在 .NET Core 2.0 中 HttpCookie 不可用。经过所有研究,我发现我们只能获取 cookie 值,不能像您上面提到的那样修改 cookie。甚至在 .Net Core 2.0 中都没有 _response.Cookies.Set(cookie); Set() 扩展方法。 - Pirate
@Dave - 请查看我下面提供的答案 - https://dev59.com/llUM5IYBdhLWcg3wY_a2#57976991 - Dave Black
@Pirate - 请查看我下面提供的答案 - https://dev59.com/llUM5IYBdhLWcg3wY_a2#57976991 - Dave Black

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接