在身份服务器离线时验证 access_token

Validating access_token when identityserver goes offline

我已经安装了 IdentityServer4。据我了解,我的 webapi 需要保护,从 IdentityServer4 获取 public 密钥并使用此密钥来验证 JWT 的签名密钥。我似乎找不到任何描述 public 密钥被请求频率的文档。是否在每次验证时都要求它?它是否缓存在需要验证的 Web api 上?

我可以为 public 键应用某种缓存,还是自动发生?

对于网络 api 我使用标准的 .NET Core 身份来设置 Bearer 的验证:

        services.AddAuthentication("JWT")
                .AddJwtBearer("JWT", options =>
                {
                    options.Authority = "https://identityserver4.tld";
                    options.RequireHttpsMetadata = false;
                    options.Audience = "webapi";
                });

看来我可以使用这里的一些代码:https://devblogs.microsoft.com/aspnet/jwt-validation-and-authorization-in-asp-net-core/:

var tokenValidationParameters = new TokenValidationParameters
{
    ValidateIssuerSigningKey = true,
    ValidateIssuer = true,
    ValidIssuer = "http://localhost:5000/",
    IssuerSigningKey = new X509SecurityKey(new X509Certificate2(certLocation)),
};

app.UseJwtBearerAuthentication(new JwtBearerOptions()
{
    Audience = "http://localhost:5001/", 
    AutomaticAuthenticate = true,
    TokenValidationParameters = tokenValidationParameters
});

这会在本地给我 public 密钥,但仍然是:当不使用上述 tokenValidationParameters 时,public 密钥多久获取一次?

ASP.Net Core 中的默认身份验证中间件将在您的 options.Authority uri 上调用发现端点,并将缓存身份的 public 密钥(以及其他配置信息)提供商指定。缓存当前发生在第一次进行身份验证时。上次我检查时,内存缓存被用来存储身份提供者配置(例如 public 键)。

看起来这目前发生在 PostConfigure(...) function here

显然,理论上您可以根据 source code.

通过在 JwtBearerOptions 中提供以下接口的实现来插入您自己的身份提供程序配置管理。
    /// <summary>
    /// Responsible for retrieving, caching, and refreshing the configuration from metadata.
    /// If not provided, then one will be created using the MetadataAddress and Backchannel properties.
    /// </summary>
    public IConfigurationManager<OpenIdConnectConfiguration> ConfigurationManager { get; set; }

默认实现使用 OpenIdConnectConfigurationRetriever,您可以找到其源代码 here