Identity Server调用是它自己的配置端点

时间:2019-01-22 14:06:16

标签: c# asp.net-core identityserver4

我有两个需要身份验证的客户端。

一个客户端是使用隐式流的spa,另一个客户端是使用客户端凭证流进行登录的直接系统集成。

由于某种原因,当我的客户端凭据客户端调用我的API时,我的Identity Server应用程序尝试自行调用.well_known/openid-configuration端点。

该调用没有任何意义,因为首先看到的是服务器在提供服务,而服务器本身试图调用端点。

是否有一种无需身份服务器调用其自身端点即可填充此配置的方法?

以下是我的身份服务器配置的摘录。

services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = "Bearer";
            options.DefaultChallengeScheme = "oidc";
        }).AddOpenIdConnect("oidc", options =>
        {
            options.SignInScheme = openIdConnectConfig.SignInScheme;
            options.SignOutScheme = IdentityServerConstants.SignoutScheme;

            options.Authority = openIdConnectConfig.Authority;
            options.RequireHttpsMetadata = false;

            options.ClientId = clientConfig.First(x => x.ClientId == "spa_app").ClientId;

            options.SaveTokens = true;
            options.SignedOutRedirectUri = "http://localhost:8080";
        }).AddIdentityServerAuthentication(options =>
        {
            options.Authority = openIdConnectConfig.Authority;
            options.RequireHttpsMetadata = false;

            options.ApiName = "api_client";
        });

1 个答案:

答案 0 :(得分:1)

无法阻止此行为(至少除非您尝试实现IConfigurationManager<OpenIdConnectOptions>,否则不能避免)。这实际上是一种预期的行为,因为您将Web应用程序和身份服务器托管在同一应用程序上。对其端点的调用归因于AddOpenIdConnect身份验证方案,当您启动应用程序时,该身份验证方案将获取身份提供者元数据信息以进行JWT验证。

从理论上讲,您可以实施不调用IConfigurationManager<OpenIdConnectOptions>端点的MetadataAddress并在身份验证方案构建器中进行设置。

.AddOpenIdConnect("oidc", options =>
        {
            ...
            ConfigurationManager = myCustomConfigurationManager,  //You would need to implement this
            ...
        })

这是导致对MetadataAddress端点(默认为authorityUri + /.well_known/openid-configuration)的调用的罪魁祸首。

我建议不要这样做,因为最终您仍然需要身份提供者元数据信息,因此必须将其快照并存储在本地或类似的地方。