背景:
对于身份验证,我们使用AWS Cognito。我们的项目包含一个API服务器和一个Web服务器。在客户端,当用户登录到应用程序时,我们将用户名和密码发送到返回JWT访问令牌的cognito实例。我们在cookie中设置访问令牌,然后将用户重定向到首页。在http服务器端,对于每个请求访问私有页面的请求,我们都会检查cookie并验证JWT访问令牌。同样,在API方面,对于每个请求,我们都会检查Cookie并验证访问令牌。
当用户从应用程序注销时,我们从cookie删除cookie和注销。这是删除Cookie的代码-
function clearCookie(name: string, domain: string, path: string) {
const derivedDomain = domain || document.domain;
const derivedPath = path || "/";
document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:01 GMT; domain=${derivedDomain}; path=${derivedPath}`;
};
问题:
当用户注销后按浏览器的后退按钮时,会发生此问题。似乎当用户按下“后退”按钮时,页面与cookie一起从缓存中恢复。而且,由于JWT访问令牌仍然有效,因此在用户按下“后退”按钮后,他们仍然可以进行api调用并浏览应用程序。
有什么办法解决这个问题?我如何删除cookie,以便按返回按钮将不会恢复cookie?我应该使用其他任何身份验证工作流程来解决此问题吗?
答案 0 :(得分:0)
我认为可以有很多解决方案。
据我所知,最好的办法是在服务器端使JWT访问令牌失效。
另一种解决方案是使用javascript禁用“后退”按钮。 您可以使用类似的内容:
(function (global) {
if(typeof (global) === "undefined") {throw new Error("undefined window")}
global.onhashchange = function () {
if (global.location.hash !== hs) {
global.location.hash = hs;
}
};
var hs = "!";
var BackspaceBlock = function () {
global.location.href += "#";
global.setTimeout(function () {
global.location.href += "!";
}, 50);
};
global.onload = function () {
BackspaceBlock();
document.body.onkeydown = function (e) {
var tm = e.target.nodeName.toLowerCase();
if (e.key === 'Backspace' && (tm !== 'input' && tm !== 'password' && elm !== 'textarea' && elm !== 'email' && elm !== 'url')) //other inputs in which you want backspace not disabled
{
e.preventDefault();
}
e.stopPropagation();
};
}
})(window);
答案 1 :(得分:0)
HttpCookie httpCookie = default(HttpCookie);
int i = 0;
string cookieName = null;
int limit = Request.Cookies.Count - 1;
for (i = 0; i <= limit; i++)
{
cookieName = Request.Cookies(i).Name;
httpCookie = new HttpCookie(cookieName);
httpCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(httpCookie);
}