如何使用ConfigurationManager?(Microsoft.IdentityModel.Protocols)

21

由于另一个NuGet包的原因,我最近被迫更新我的System.IdentityModel.Tokens.Jwt NuGet包到5.1.4。大部分代码在更改后似乎很容易解决,但现在ConfigurationManager<OpenIdConnectConfiguration>()需要两个参数而不是一个! 我找不到任何关于如何使用这个新版本配置管理器的示例!

我将其作为以下代码的一部分使用:

string stsDiscoveryEndpoint = string.Format("{0}/.well-known/openid-configuration", authority);

ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, IConfigurationRetriever<>);

OpenIdConnectConfiguration config = await configManager.GetConfigurationAsync();
_issuer = config.Issuer;
_signingTokens = config.SigningTokens.ToList();

_stsMetadataRetrievalTime = DateTime.UtcNow;

请问有谁能告诉我ConfigurationManager需要哪些参数?

2个回答

38

我发现为了使ConfigurationManager与版本>=5.1.4的System.IdentityModel.Tokens.Jwt NuGet包配合使用,您需要将OpenIdConnectConfigurationRetriever()作为第二个参数添加。

然后正确调用ConfigurationManager

ConfigurationManager<OpenIdConnectConfiguration> configManager = new ConfigurationManager<OpenIdConnectConfiguration>(stsDiscoveryEndpoint, new OpenIdConnectConfigurationRetriever());

1
你也可以使用 AddJwtBearer(o => o.options.MetadataAddress = "") - cSteusloff
2
@cSteusloff,由于这个问题涉及到实例化“ConfigurationManager”,我认为您需要更多的上下文才能理解您的评论。 - Jeppe
1
当您设置“MetadataAddress”时,可以创建ConfigurationManager <OpenIdConnectConfiguration>的默认实现。在您的示例中,您仅创建了默认管理器。 - cSteusloff
嗨@Jeppe,你知道JwtBearerOptions.Authority和JwtBearerOptions.MetadataAddress之间的区别吗?我只设置了JwtBearerOptions.Authority ="my-openid-connect" url,令牌验证正在工作,并且似乎从分配给JwtBearerOptions.Authority的给定地址中发现了公钥。 - Shaheer

5

根据您想要做什么,您可以直接更改代码,并调用配置检索器,像这样:

        string issuerEndpoint = "https://my.auth.server";
        var openidConfiguration = await OpenIdConnectConfigurationRetriever.GetAsync(
                    $"{issuerEndpoint}/.well-known/openid-configuration", CancellationToken.None);

        app.UseJwtBearerAuthentication(
        new Microsoft.Owin.Security.Jwt.JwtBearerAuthenticationOptions()
        {
            TokenValidationParameters =
                new TokenValidationParameters
                {
                    ValidIssuer = openidConfiguration.Issuer,
                    ValidateAudience = false,
                    IssuerSigningKeys = openidConfiguration.SigningKeys,
                    IssuerSigningTokens = openidConfiguration.SigningTokens
                }
        });

非常感谢Diego,看起来这是一个不错的替代方案,如果一些辅助类无法工作。不幸的是,它对我来说行不通,因为代码只是用于检索和验证令牌,而不是用于登录。 - Jeppe
啊,好的,我把它发在这里让其他人也可以使用,或许你可以在这里找到类似的解决方案。 - Diego Mendes
5
请注意,OpenIdConnectConfigurationRetriever.GetAsync() 不会缓存已检索的配置,而 ConfigurationManager<>.GetConfigurationAsync() 则会缓存。 - torvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接