1

我有一个使用 OpenID Connect 和 Identity Server 4 的 ASP.net core 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 连接中间件中是否有一些事件可以检测到它何时无法获取此刷新令牌,并且我可以使用它以某种方式再次强制登录(或至少往返身份服务器/授权端点)?

4

1 回答 1

0

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

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

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

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

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

您可以参考这篇文章,它可能对您有所帮助:OpenID Connect 中 ID Token 到期时间的意图是什么?

于 2021-07-02T06:34:34.693 回答