我有两个需要身份验证的客户端。
一个客户端是使用隐式流的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";
});
答案 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
)的调用的罪魁祸首。
我建议不要这样做,因为最终您仍然需要身份提供者元数据信息,因此必须将其快照并存储在本地或类似的地方。