删除 .net core 2.0 中的 cookie
Delete cookies in .net core 2.0
我正在开发 .Net Core 2.0 MVC Web 应用程序。需要操作身份验证 cookie 以根据用户角色设置过期时间跨度。过期时间跨度后,如果没有activity,用户将退出应用程序。为此,我创建了一个过滤器,每次用户与网站交互时都会调用它。在该过滤器中,我基本上是读取 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 documentation 说我们不能从用户的电脑上删除 cookie。那么有什么方法可以从硬盘驱动器中删除cookie?如果不是,Response.Cookies.Delete(cookie);
做什么?
清除响应的 cookie 并不指示浏览器清除 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);
}
}
您可以像这样设置 cookie 的过期时间:
Response.Cookies.Append("cookieName", "", new CookieOptions() {
Expires = DateTime.Now.AddDays(-1)
});
当浏览器从服务器得到响应时,它会看到名称为 cookieName
的 cookie 已过期。因此,浏览器会删除cookie。
在 ASP.NET Core 中,您 can/should 使用以下方法:
private void DeleteCookies()
{
foreach (var cookie in HttpContext.Request.Cookies)
{
Response.Cookies.Delete(cookie.Key);
}
}
它在内部所做的是在 Http 响应 Header 中发送 'Set-Cookie' 指令,以指示浏览器使 cookie 过期并清除其值。
- ASP.NET ResponseCookies.Delete Method
的核心源代码
- MSDN 文档在这里 - IResponseCookies.Delete Method
响应示例 header:
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
var Cookieoption1 = new CookieOptions();
Cookieoption1.Path = HttpContext.Request.PathBase;
foreach (var cookieKey in Request.Cookies.Keys)
{
HttpContext.Response.Cookies.Delete(cookieKey, Cookieoption1);
}
我正在开发 .Net Core 2.0 MVC Web 应用程序。需要操作身份验证 cookie 以根据用户角色设置过期时间跨度。过期时间跨度后,如果没有activity,用户将退出应用程序。为此,我创建了一个过滤器,每次用户与网站交互时都会调用它。在该过滤器中,我基本上是读取 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 documentation 说我们不能从用户的电脑上删除 cookie。那么有什么方法可以从硬盘驱动器中删除cookie?如果不是,Response.Cookies.Delete(cookie);
做什么?
清除响应的 cookie 并不指示浏览器清除 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);
}
}
您可以像这样设置 cookie 的过期时间:
Response.Cookies.Append("cookieName", "", new CookieOptions() {
Expires = DateTime.Now.AddDays(-1)
});
当浏览器从服务器得到响应时,它会看到名称为 cookieName
的 cookie 已过期。因此,浏览器会删除cookie。
在 ASP.NET Core 中,您 can/should 使用以下方法:
private void DeleteCookies()
{
foreach (var cookie in HttpContext.Request.Cookies)
{
Response.Cookies.Delete(cookie.Key);
}
}
它在内部所做的是在 Http 响应 Header 中发送 'Set-Cookie' 指令,以指示浏览器使 cookie 过期并清除其值。
- ASP.NET ResponseCookies.Delete Method 的核心源代码
- MSDN 文档在这里 - IResponseCookies.Delete Method
响应示例 header:
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
var Cookieoption1 = new CookieOptions();
Cookieoption1.Path = HttpContext.Request.PathBase;
foreach (var cookieKey in Request.Cookies.Keys)
{
HttpContext.Response.Cookies.Delete(cookieKey, Cookieoption1);
}