IDX20803: 无法获取配置信息

29

我知道这个问题已经有答案了,但我不明白人们到底是如何做的(关于证书、SSL),并且他们都使用本地主机,但我没有。

我以这个示例作为我的例子:OpenIdConnect

我正在使用:

  • 一个 Web 应用程序
  • 一个 Web API

两者都使用 .Net Core 2.1。Web 应用程序使用 Azure AD 连接来获取 JwtBearer 令牌,并将其发送到 API。

在 API 中看到路由 /api/information,Web 应用程序向 API 发送请求,而 API 返回上面的错误。

具体错误是:

System.InvalidOperationException: IDX20803: Unable to obtain configuration from: 'https://<mycompany>.onmicrosoft.com/<big Guid of 72 chars>/.well-known/openid-configuration'.

因此,我尝试通过添加证书,添加必要的库(System.Net.Http v4.3.3),检查Azure AD中的每个权限来解决此错误,但这些都没有起作用。

如果您需要更多信息,我可以通过在此帖子中添加它们来提供。

12个回答

16

如果有人遇到此问题并且正在使用Azure B2C,则实例是您的Azure B2C租户的根网址。例如:https://myroot.b2clogin.com/。域应该是:myroot.onmicrosoft.com/

请确保域中没有https。

这对我有用。

{
    "AzureADB2C": {
        "CallbackPath": "/signin-oidc",
        "ClientId": "<app-registration-app-client-id>",
        "ClientSecret": "<secret-value>",
        "Domain": "<domain-name>.onmicrosoft.com/",
        "EditProfilePolicyId": "B2C_1_profile",
        "Instance": "https://<domain-name>.b2clogin.com/",
        "ResetPasswordPolicyId": "B2C_1_reset",
        "SignUpSignInPolicyId": "B2C_1_signupsignin"
    }
}

非常感谢!在我的情况下,我必须将实例和域调整为所描述的格式。 - Henrique Pessoa
如果您使用了错误的策略ID,也会发生这种情况。 - ajbeaven

11

通过在appsettings.json中进行替换解决了问题:

"AzureAd": {
     "Instance": "<APP_Uri_from_Azure_Portal>",
...
}

To

"AzureAd": {
     "Instance": "https://login.microsoftonline.com/",
...
}

19
这里的解释是,错误的原因是它试图从 {instance}{tenantid}/.well-known/openid-configuration 下载 OpenId 配置文件,例如 https://login.microsoftonline.com/common/.well-known/openid-configuration。该文件包含可获取令牌签名公钥等信息的 URL。身份验证处理程序在启动时加载此文件以加载其配置,以验证身份提供者提供的令牌。因此,在使用 Azure AD 时,必须使用 Azure AD 实例的 URL + 租户 ID(或使用 "common" 进行多租户)。 - juunas
但是由于您提供了另一个URL / URI,它当然无法找到元数据文档并崩溃了。 - juunas

11

通过在 Startup-->Configure 中添加以下代码解决了问题。

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls 
                                       | SecurityProtocolType.Tls11
                                       | SecurityProtocolType.Tls12
                                       | SecurityProtocolType.Ssl3;

谢谢,这最终对我起作用了。顺便说一下,我开发了一些代码,在 .net core 3.1 中可以验证签名,但是我将该代码放入一个 .net 4.x 项目中,代码无法工作,并且出现与 OP 相同的错误。我猜这些设置在 .net 4.x 中默认未设置,但在 .net core 3.1 中默认设置了。 - Jason Cheng

3
对我来说,问题与防火墙/网络有关 - 当我在浏览器中输入“/.well-known/openid-configuration”URL时,我可以访问它,但 API 本身无法访问(API 和身份服务器托管在同一个应用程序中)。API 托管在 Azure 中,并且我已经创建了一个出站安全规则(用于与子网集成到我的应用程序服务计划的网络安全组相关联),这会阻止 API 调用其所属应用程序服务计划中的任何其他应用程序服务,包括自身。添加一个新的出站安全规则以允许调用解决了我的问题(我意识到这导致了一个非常类似于提交者的错误,但出于不同的原因,这是一个边缘情况 - 大多数人可能没有设置此类限制)。

3
正如@juunas在上面的评论中提到的那样,身份验证处理程序在启动时加载此配置文件以加载其用于验证身份提供者提供的令牌的配置。
文件路径终点也可以在应用程序注册部分找到。如果您转到应用程序注册=>概述=>端点,然后查找OpenID Connect配置端点(v2)。

enter image description here

B2C身份验证处理程序的Startup.cs代码如下,并且我已经在appsettings中提供了值。
services.AddAuthentication(options =>
        {
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })
          .AddJwtBearer(jwtOptions =>
          {
              jwtOptions.Authority = $"{Configuration["AzureAdB2C:Instance"]}/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/";
              jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
              jwtOptions.Events = new JwtBearerEvents
              {
                  OnAuthenticationFailed = AuthenticationFailed
              };
          });

 "AzureAdB2C": {
         "Tenant": "xxxxxxxxxb2c.onmicrosoft.com",
         "Instance": "xxxxxxxxxxxb2c.b2clogin.com",
         "ClientId": "xxxxxx-764c-4e4a-b0ec-xxxxxxf",
         "Policy": "B2C_1_signin1",
         "ScopeRead": "demo.read",

               },

1
在我的情况下,我的appSettings中缺少了Authority key。
"AzureAdB2C": {
    "Instance": "https://login.microsoftonline.com",
    "Authority": "https://login.microsoftonline.com/<your tenant id>",
    "ClientId": "...",
    "TenantId": "...",
    "Domain": "https://<your name>.b2clogin.com",
    "SignedOutCallbackPath": "/signout/B2C_1_susi",
    "SignUpSignInPolicyId": "b2c_1_susi",
    "ResetPasswordPolicyId": "b2c_1_reset",
    "EditProfilePolicyId": "b2c_1_edit_profile",
    "CallbackPath": "/signin-oidc"
  }

1

补充@AmirAli的答案。

在使用.NET 6的msidentity-app-sync tool工具后,我的错误如下:

https://github.com/AzureAD/microsoft-identity-web/blob/master/tools/app-provisioning-tool/vs2019-16.9-how-to-use.md

系统无效操作异常:IDX20803:无法从'https://login.microsoftonline.com/<myAD>.onmicrosoft.com/B2C_1_signupsignin/v2.0/.well-known/openid-configuration'获取配置。

appsettings.json中的AzureAd:Instance从默认值https://login.microsoftonline.com/更改为https://<myAD>.b2clogin.com/,然后它就可以工作了。


0
在我的情况下,https://.b2clogin.com被防火墙屏蔽了,错误消息也完全相同,因此允许该URL(通过修改防火墙规则)允许服务器访问https://xxxx.b2clogin.com解决了这个问题。希望能对您有所帮助。

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
在我的情况下,我从几个地方运行了应用程序(VSCode、Rider和控制台),一些进程仍在后台运行。只需重新启动计算机,问题就解决了。

0
今天我的情况是,我不得不重新启动应用程序服务,然后它又恢复正常了。

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