微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

刷新令牌不再有效时强制登录

如何解决刷新令牌不再有效时强制登录

我有一个使用 OpenID Connect 和 Identity Server 4 的 ASP.net 核心 3.1 MVC 应用程序。 我正在使用 IdentityModel 在我的应用程序中自动刷新访问令牌。配置如下:

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies",options =>
{    
    options.SlidingExpiration = false;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
})
.AddOpenIdConnect("oidc",options =>
{
    options.Authority = "https://localhost:5001";

    options.ClientId = "mvc";
    options.ClientSecret = "secret";
    options.ResponseType = "code";

    options.Savetokens = true;

    options.Scope.Add("profile");
    options.Scope.Add("api1");
    options.Scope.Add("offline_access");
    options.GetClaimsFromUserInfoEndpoint = true;
    options.SignedOutCallbackPath = "/oidc-signout";
    options.SignedOutRedirectUri = "/goodbye";
});

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

services.AddHttpClient("api1",configure =>
{
    configure.BaseAddress = new Uri("https://localhost:6001");
});

services.AddAccesstokenManagement();

我有一个控制器,它将从使用该身份服务器保护的下游 API 中提取数据。我的 MVC 客户端请求范围 api1 和 offline_access 以获取刷新令牌。这些令牌存储在 cookie 中,因为在服务上设置了 Savetokens = true

一切正常。当我登录时,我获得了访问令牌和刷新令牌。我的访问令牌持续了大约 20 分钟,当它到期时,它会使用刷新令牌调用令牌端点以获取新的访问令牌 + 刷新令牌。

我不确定如何处理的一种情况是我的刷新令牌生命周期已过。如果我将刷新令牌生命周期设置为 8 小时,但我的 MVC 会话仍处于活动状态,它将尝试获取新的刷新令牌并失败。

OpenID 连接中间件中是否有一些我可以处理的事件可以检测它何时无法获取此刷新令牌,我是否可以使用它以某种方式强制登录(或至少往返身份服务器/授权端点) ?

解决方法

我找到的一个解决方案是将其挂接到 Cookies 中间件中。以下是一般流程:

在每个请求中,使用 Cookies 中间件事件来检查访问令牌。

如果它接近到期时间,请请求一个新的。

替换 ClaimsIdentity 中的新访问和刷新令牌。

指示 Cookies 中间件更新会话 cookie,使其包含新的令牌。

你可以参考这篇文章,它可能对你有帮助:What is intent of ID Token expiry time in OpenID Connect?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。