首页 > 解决方案 > 令牌过期后如何立即将用户重定向到登录页面

问题描述

我试图在令牌过期后立即将用户重定向到登录页面,而不是在下次单击它现在的样子之后。我已经设定

PostLogoutRedirectUri, FrontChannelLogoutUri, IdentityTokenLifetime, AccessTokenLifetime

正确,并且在令牌到期后将用户重定向到登录页面工作正常。但这不是即时的,需要点击。有没有办法立即重定向用户?

标签: asp.netidentityserver4

解决方案


我遇到了类似的问题,可以展示我的解决方案:

一些解释性的词:

使用 cookie 身份验证,用户将获得一个包含身份验证票证的 cookie。票据由服务器加密并包含一个生命周期。每次发送请求时,都会发送安全票证,并由服务器评估生命周期。然后,如果剩余生命周期小于配置会话生命周期的一半,则重置身份验证票证中的生命周期。

我的做法:

知道这个过程,我想出的唯一解决方案是在客户端处理注销(以及在我的场景中会话更新)。一般的做法是启动一个JS计数器,统计到服务器配置的会话时间;在生命周期结束前 3 分钟显示续订弹出窗口,并在会话生命周期结束前一分钟重定向到登录页面。

以下是我使用的一些片段:

这是我所有模板的一部分:

jQuery(function{
        @if (HttpContext.Current != null && HttpContext.Current.Session["timeOutValue"] != null)
        {
            @:var timeOutMinute = @HttpContext.Current.Session["timeOutValue"].ToString();
        }
        else
        {
            @:var timeOutMinute = 20;
        }

        localStorage.setItem("timeoutInMinutes", timeOutMinute)
        sessionWarning(timeOutMinute);
});

这是我的函数处理计时器和更新对话:

function sessionWarning(timeoutMinutes) {
var warningTime = ((timeoutMinutes - 3) * 60 * 1000);
var sessionTimer = parseInt(localStorage.getItem("sessionTimer"));
if ((sessionTimer !== null) && (sessionTimer < ((timeoutMinutes * 60 * 1000) / 2))) {
    warningTime = warningTime - sessionTimer;
}
else {
    localStorage.setItem("sessionTimer", "0");
    sessionTimer = 0;
}
clearTimeout(timer);
timer = setTimeout(function () {
    jQuery("#modal-session-container").modal();
}, warningTime);
intervalTimer = setInterval(function () {
    if (isNaN(parseInt(localStorage.getItem("sessionTimer")))) {
        localStorage.setItem("sessionTimer", "0");
    }
    if (!isNaN(timer)) {
        localStorage.setItem("sessionTimer", String(parseInt(localStorage.getItem("sessionTimer")) + 1000));
    }
}, 1000);
}

我希望这有帮助!


推荐阅读