如何使用存储在 HttpOnly Cookie 中的令牌注销
How To Logout Using Token Stored In HttpOnly Cookie
我目前正在使用 Microsoft 的身份来帮助我在 Asp .NET Web API 项目中进行身份验证。我正在生成不记名令牌并将其存储在名为 AUTH
的 HttpOnly
cookie 中
由于我没有在我的数据库中存储与令牌相关的任何内容,我该如何注销?在将令牌存储在会话存储中之前,我只是将其从客户端删除,但现在由于我将令牌存储在 HttpOnly
cookie 中,所以我无法在客户端执行任何操作。
我是否在服务器上调用一个路由来响应一个新的 cookie AUTH
并且有一个空值?我试过了,但是来自 logout
的响应 cookie 似乎并没有取代 HttpOnly
cookie,它只是创建了一个会话 cookie。
这就是我生成 AUTH
cookie
的方式
context.Response.Cookies.Append("AUTH", accessToken,
new Microsoft.Owin.CookieOptions
{
HttpOnly = true,
Expires = DateTime.UtcNow.AddMinutes(5)
});
这就是我从 logout
路由生成响应的方式。
var authCookie = new CookieHeaderValue("AUTH", "");
var xsrfCookie = new CookieHeaderValue("XSRF", "");
ActionContext.Response = new HttpResponseMessage();
ActionContext.Response.Headers.AddCookies(new CookieHeaderValue[] { authCookie, xsrfCookie });
return ActionContext.Response;
出于某种原因,此处返回的 cookie 不会覆盖使用身份验证令牌创建的 cookie。
这是在 HttpOnly
cookie 中存储身份验证令牌时注销用户的最佳策略吗?
如果您没有存储身份验证令牌,则无法使其无效。所以你可以强制浏览器从服务器上删除Cookie。尝试添加 Domain
和 Path
。您还可以将 Expires
设置为昨天,以便浏览器在收到 cookie 后立即将其删除。
authCookie.HttpOnly = true;
authCookie.Expires = DateTime.UtcNow.AddDays(-1);
authCookie.Domain = "localhost";
authCookie.Path = "/";
xsrfCookie.Expires = DateTime.UtcNow.AddDays(-1);
xsrfCookie.Domain = "localhost";
xsrfCookie.Path = "/";
一个解决方案似乎是存储一个额外的(非 HTTPOnly)cookie,它有一个“签名”,可以验证原始 HttpOnly cookie 是否仍然有效。
在后端,您应该检查 HttpOnly cookie 是否有效,并检查非 HttpOnly cookie 的值(签名),以便您知道客户端是否已将其无效。有很多技术可以做到这一点。只需确保您无法使用非 HttpOnly cookie 获取 HttpOnly cookie 的内容。
另一种解决方案是在用户注销时添加新的 cookie/local 存储,例如“has_logout”,然后在下一次成功请求时,如果“has_logout”是是的,您应该调用 /logout 端点。
希望有道理
我目前正在使用 Microsoft 的身份来帮助我在 Asp .NET Web API 项目中进行身份验证。我正在生成不记名令牌并将其存储在名为 AUTH
HttpOnly
cookie 中
由于我没有在我的数据库中存储与令牌相关的任何内容,我该如何注销?在将令牌存储在会话存储中之前,我只是将其从客户端删除,但现在由于我将令牌存储在 HttpOnly
cookie 中,所以我无法在客户端执行任何操作。
我是否在服务器上调用一个路由来响应一个新的 cookie AUTH
并且有一个空值?我试过了,但是来自 logout
的响应 cookie 似乎并没有取代 HttpOnly
cookie,它只是创建了一个会话 cookie。
这就是我生成 AUTH
cookie
context.Response.Cookies.Append("AUTH", accessToken,
new Microsoft.Owin.CookieOptions
{
HttpOnly = true,
Expires = DateTime.UtcNow.AddMinutes(5)
});
这就是我从 logout
路由生成响应的方式。
var authCookie = new CookieHeaderValue("AUTH", "");
var xsrfCookie = new CookieHeaderValue("XSRF", "");
ActionContext.Response = new HttpResponseMessage();
ActionContext.Response.Headers.AddCookies(new CookieHeaderValue[] { authCookie, xsrfCookie });
return ActionContext.Response;
出于某种原因,此处返回的 cookie 不会覆盖使用身份验证令牌创建的 cookie。
这是在 HttpOnly
cookie 中存储身份验证令牌时注销用户的最佳策略吗?
如果您没有存储身份验证令牌,则无法使其无效。所以你可以强制浏览器从服务器上删除Cookie。尝试添加 Domain
和 Path
。您还可以将 Expires
设置为昨天,以便浏览器在收到 cookie 后立即将其删除。
authCookie.HttpOnly = true;
authCookie.Expires = DateTime.UtcNow.AddDays(-1);
authCookie.Domain = "localhost";
authCookie.Path = "/";
xsrfCookie.Expires = DateTime.UtcNow.AddDays(-1);
xsrfCookie.Domain = "localhost";
xsrfCookie.Path = "/";
一个解决方案似乎是存储一个额外的(非 HTTPOnly)cookie,它有一个“签名”,可以验证原始 HttpOnly cookie 是否仍然有效。
在后端,您应该检查 HttpOnly cookie 是否有效,并检查非 HttpOnly cookie 的值(签名),以便您知道客户端是否已将其无效。有很多技术可以做到这一点。只需确保您无法使用非 HttpOnly cookie 获取 HttpOnly cookie 的内容。
另一种解决方案是在用户注销时添加新的 cookie/local 存储,例如“has_logout”,然后在下一次成功请求时,如果“has_logout”是是的,您应该调用 /logout 端点。
希望有道理