【问题标题】:How to remove the cookies properly when user logs out of the session?用户退出会话时如何正确删除 cookie?
【发布时间】:2020-04-08 01:30:49
【问题描述】:

背景:

对于身份验证,我们使用 AWS Cognito。我们的项目包含一个 API 服务器和一个 Web 服务器。在客户端,当用户登录应用程序时,我们将用户名和密码发送到 cognito 实例,该实例返回 JWT 访问令牌。我们在 cookie 中设置访问令牌并将用户重定向到主页。在 http 服务器端,对于私有页面的每个请求,我们都会检查 cookie 并验证 JWT 访问令牌。同样在 API 端,对于每个请求,我们都会检查 cookie 并验证访问令牌。

当用户从应用程序中注销时,我们会删除 cookie 并从 cognito 中注销。这是删除 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?我应该使用任何其他身份验证工作流程来解决这个问题吗?

【问题讨论】:

  • 为什么不在服务器端让 JWT 访问令牌在注销时过期
  • 浏览器缓存页面不会恢复 cookie。检查您的 cookie 是否标记为 httponly。如果是这样,您将无法使用此客户端 js 清除它。在这种情况下,您需要注销 HTTP 请求以使用清除 cookie 的 Set-Cookie 标头进行响应。
  • @StephenCrosby 这不是 httpOnly cookie。如果浏览器没有从缓存中恢复 cookie,那你为什么认为它正在恢复呢?
  • @RasheduzzamanSourov 我能想到的只有 3 种可能性 1) cookie 没有被删除,2) cookie 被删除了,但是正在运行的 javascript 又写了一遍,3) 恢复的页面使一个请求,该请求导致包含一个 Set-Cookie 标头的响应,该标头可以恢复它。我会查看调试面板中的网络选项卡,看看哪个请求是第一个包含包含该 cookie 的 Cookie 标头的请求。这可能有助于查明罪魁祸首。

标签: authentication cookies amazon-cognito


【解决方案1】:
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);
}

【讨论】:

  • 嗨...删除一个 cookie 并从用户的硬盘中物理删除它是很棘手的。您不能直接删除 cookie,因为 cookie 在用户的计算机上。但是,您可以让浏览器为您删除 cookie。该技术是创建一个与要删除的 cookie 同名的新 cookie,但将 cookie 的到期日期设置为早于今天的日期。当浏览器检查 cookie 的过期时间时,浏览器将丢弃现在过期的 cookie。上面的代码显示了一种删除应用程序可用的所有 cookie 的方法:
  • @AmanKedia 这就是我现在正在做的事情。请检查clearCookies 功能。它基本上做同样的事情。
【解决方案2】:

我认为可以有很多解决方案。

根据我的看法,如果可能的话,最好的办法是在服务器端使 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);

【讨论】:

    猜你喜欢
    • 2010-11-08
    • 2022-01-03
    • 2012-09-01
    • 1970-01-01
    • 2011-10-28
    • 2013-09-12
    • 2014-04-16
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多