C# 身份服务器调用它';用户自己的配置端点

C# 身份服务器调用它';用户自己的配置端点,c#,asp.net-core,identityserver4,C#,Asp.net Core,Identityserver4,我有两个客户端需要身份验证 一个客户端是使用隐式流的spa,另一个是使用客户端凭据流进行登录的直接系统集成 出于某种原因,当我的客户端凭据客户端调用我的API时,我的Identity Server应用程序会尝试调用自身上的.well\u known/openid配置端点 调用毫无意义,因为首先为配置提供服务的服务器正试图自己调用端点 有没有一种方法可以在不让identity server调用自己的端点的情况下填充此配置 下面是我的Identity server配置的代码段 services.Ad

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

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

出于某种原因,当我的客户端凭据客户端调用我的API时,我的Identity Server应用程序会尝试调用自身上的
.well\u known/openid配置
端点

调用毫无意义,因为首先为配置提供服务的服务器正试图自己调用端点

有没有一种方法可以在不让identity server调用自己的端点的情况下填充此配置

下面是我的Identity server配置的代码段

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";
        });

无法防止这种行为(至少除非您尝试实现
IConfigurationManager
)。这实际上是一种预期行为,因为您的web应用程序和identity server托管在同一个应用程序上。调用自己的端点是由于
AddOpenIdConnect
身份验证方案,当您启动应用程序时,该方案将获取身份提供商元数据信息,以进行JWT验证

理论上,您可以实现不调用
MetadataAddress
端点的
IConfigurationManager
,并在身份验证方案生成器中进行设置

.AddOpenIdConnect("oidc", options =>
        {
            ...
            ConfigurationManager = myCustomConfigurationManager,  //You would need to implement this
            ...
        })
这就是负责调用
MetadataAddress
端点的罪魁祸首,默认情况下,端点是
authorityUri+/.众所周知的/openid配置


我建议不要这样做,因为最终您将需要identity provider元数据信息,因此必须在本地或类似的地方对其进行快照和存储。

是您从identity Server实现中显示的代码吗?我不知道它是否在启动时调用它,但当我使用客户端凭据流访问API控制器时,它确实会调用它。对于我的隐式流SPA,它不会发生。实际上,它不会在启动时调用端点,因为它会使我的整个应用程序崩溃。在我们的网络上,像这样的请求,通过公共主机访问专用服务器是不起作用的。@Tjaart它取决于身份验证中间件是如何实现的。我可以理解为什么它不会在启动时调用,因为它可以在第一次尝试获取发现文档信息后缓存它。我的观点仍然站得住脚,即使它没有在启动时调用。我已经找到了另一个解决方案,允许这样做。我只是觉得它自己调用端点是奇怪和不寻常的。