InvalidOperationException: IDX20803: 无法从 '[PII is hidden]' 获取配置。

87

我已经将我的API和客户端应用程序部署在Docker上,但是网站应用程序无法调用API,我一直收到异常。

我添加了其他帖子中建议的以下行,但并没有起作用。

IdentityModelEventSource.ShowPII = true;

异常:

System.InvalidOperationException: IDX20803: Unable to obtain configuration from: '[PII is hidden]'.
at Microsoft.IdentityModel.Protocols.ConfigurationManager`1.GetConfigurationAsync(CancellationToken cancel)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
at IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler.HandleAuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationHandler`1.AuthenticateAsync()
at Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticateAsync(HttpContext context, String scheme)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.InvokeCore(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

3
很可能您的权限配置不正确或无法连接到元数据终点。 - juunas
2
你在哪里添加了ShowPII=true这一行? - user4864425
2
@RuardvanElburg,问题在于我的Web UI应用程序无法调用API,因为API抛出了错误[PII已隐藏],所以我添加了ShowPII=true,但错误仍然存在。 - Jane Senya
1
@RuardvanElburg 在 IDS 项目中添加了“ShowPII”后,它起作用了,我可以在日志中看到实际的错误,显然 API 无法访问配置文档。我能够从那里解决问题。感谢您的帮助。 - Jane Senya
我遇到了同样的错误。关键是,如果你先调用 app.MapControllers(); 然后再调用 app.UseSwagger(); 你会得到这个与PII无关的奇怪错误。所以,解决办法是交换顺序。祝你好运。 - undefined
显示剩余6条评论
21个回答

108
我们需要开启PII日志的查看功能,以便更详细地了解错误情况: 请在Startup.cs文件的ConfigureServices()方法中添加以下行:
public void ConfigureServices(IServiceCollection services)
{
    IdentityModelEventSource.ShowPII = true; //Add this line
    ....

3
同样的内容在 https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/wiki/PII 中提到。 - Rajat
5
这行代码应该添加到Resource.API项目中(而不是IDP项目),不要犯和我一样的错误 :) - Shahar Shokrani
7
using Microsoft.IdentityModel.Logging; 将提供 IdentityModelEventSource - Benxamin
我在 .net core 2.1 中遇到了同样的问题,当我尝试启用 ShowPII 时,它会显示:IdentityModelEventSource 没有 ShowPII 属性。请指导如何在 .net core 2.1 中启用它。 - Nilesh Gupta
这不是我的根本原因。当我添加你的代码时,会抛出一个新的错误: System.InvalidOperationException: 无法从: XXX 获取配置。 - undefined

36
在我的情况下,这是在本地环境中使用Identity Server 4开发身份原型时发生的,我的授权配置不正确。
我正在按照Identity Server 4的示例进行操作,问题在于Identity Server 4的快速入门示例包含了3个项目:
- Identity Server,端点为https://localhost:5001 - API(称为资源API或消费者API) - 客户端
在提供的示例中,Identity Server被设置为使用https,端点为https://localhost:5001。 但是,消费者API中的授权设置为http://localhost:5000
因此,当客户端尝试连接到消费者API时,它获取到的是http://localhost:5000地址,并尝试查看http://localhost:5000/.well-known/openid-configuration,但这个地址并不存在。它只存在于https://localhost:5001/.well-known/openid-configuration
到目前为止都还好。
解决方案是确保在消费者授权中使用与身份服务器相同的端点。
options.Authority = "https://localhost:5001";

1
谢谢您先生,这仍然是真的,您为我省去了很多麻烦。 - markus s
1
即使编程已经进行了四十年,有时仍然看不到树木背后的森林 :) 谢谢 - iCollect.it Ltd

30

如果您在开发过程中遇到这个问题,我能够通过清除我的开发人员证书然后重新创建它们来解决。

dotnet dev-certs https --clean
dotnet dev-certs https --trust

这个命令 "dotnet dev-certs https --trust" 在 Linux 机器或 Azure VM 上不起作用。 - Haroun Hajem
1
@HarounHajem 我实际上在运行 Linux,它在我的机器上运行正常。你可能需要安装这个工具。https://www.nuget.org/packages/dotnet-dev-certs - Jason White
2
哇,这就是对我有用的答案!非常感谢。 - Robert Tirta
1
这对我起作用了,非常感谢! - Juanma
我也是。谢谢。 - Dennis Dyallo

18

启用TLS 1.2解决了该问题。

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

7
你把这个加在哪里了? - alcaprar
@alcaprar ConfigureServices 中的第一行。 - dexter
太高兴看到这个了!谢谢!! - Jeremy Thompson

16

在.NET 6中,在Program.cs文件的builder后添加代码。例如:

using Microsoft.IdentityModel.Logging;

var builder = WebApplication.CreateBuilder(args);

IdentityModelEventSource.ShowPII = true;

对我来说,错误是:

System.InvalidOperationException: IDX20803:无法从以下位置获取配置: 'https://login.microsoftonline.com/<myAD>.onmicrosoft.com/B2C_1_signupsignin/v2.0/.well-known/openid-configuration'

解决方案在这里:

https://dev59.com/a1UL5IYBdhLWcg3wK1YU#70925127


9

如果这与使用“连接到云中现有商店”(即“Azure Active Directory B2C”)的Visual Studio Web应用程序项目相关,则所提供的配置不好。

还需要更改在Azure中使用的用户流程,如下面的文章所述:https://github.com/AzureAD/microsoft-identity-web/wiki/Azure-AD-B2C-issuer-claim-support

更改

"AzureAdB2C": {
  "Instance": "https://login.microsoftonline.com/tfp",
  "ClientId": "{clientId}",
  "Domain": "{tenant}.b2clogin.com",
  "SignUpSignInPolicyId": "{policy}"
}

To

"AzureAdB2C": {
    "Instance": "https://{tenant}.b2clogin.com/",
    "ClientId": "{clientId}",
    "Domain": "{tenant}.onmicrosoft.com",
    "SignUpSignInPolicyId": "{policy}"
}

你不需要删除/tfp吗? - Narayana
我发现我缺少了TenantId。 - The Senator

4

当身份验证服务器没有运行时,也会发生此错误。


在我的情况下,客户端和身份服务器都在运行,但客户端总是先完成。客户端略微领先,但仍然足以使客户端无法检测到身份服务器。 - Yorro

3
在使用Blazor Server.Net 6中,我必须在program.cs中的app.Run()之前添加ShowPII语句。如果我将其添加到Main的顶部,它将没有任何效果。我相信如果你愿意,你可以缩小更精确的位置,但这对我有效。
app.MapFallbackToPage("/_Host");
IdentityModelEventSource.ShowPII = true;
app.Run();

我的问题是404错误。

在B2C上使用OIDC端点,我提供以下指导建议-在B2C门户的“身份体验框架”下标识您的自定义策略,单击它,复制用于OpenID Connect发现端点的url,并将其添加为您的options.MetadataAddress值。您需要URL中的'p'查询字符串值,即您的策略名称。


1
app.Run() 直接添加在 Program.cs 中较早的位置之前,也有助于在“普通”的 ASP.Net Core 上运行,谢谢! - stefan.at.kotlin

3

解决方案有些棘手,我知道这是一个老问题,但上周我遇到了完全相同的问题,花费了相当多的时间来解决它。这个问题是因为客户端应用程序不信任API应用程序的Kestrel证书。

在客户端应用程序的Dockerfile中,您应该添加类似于以下内容的代码,以便将API应用程序使用的证书添加到客户端信任的CA列表中。

COPY ["API-KESTREL-CERTIFICATE.crt", "/usr/local/share/ca-certificates/"]
RUN update-ca-certificates

重要提示!(至少在本地环境中)您应该关心API证书的域名。在我的情况下(本地环境),我不得不创建一个多个域名的证书,因为API的“localhost”与客户端应用程序的“localhost”不同,因为它们在不同的Docker容器中运行。 话虽如此,对于API的Kestrel证书,我遵循了这篇指南来创建多域自签名证书https://www.rpkamp.com/2014/08/25/setting-up-a-multi-domain-self-signed-ssl-certificate/,并且在.cnf文件的DNS部分,我做了类似于这样的事情,并解决了问题。
DNS.1 = localhost
DNS.2 = host.docker.internal

最后,确保客户端应用程序的权限正确,并且正在正常工作的是正确的域名。

希望能对您有所帮助!


你能分享一下你使用的权威URL是什么吗? - Rajiv
我们有一个IdentityServer项目,因此基本上是该项目的URL... 该URL取决于它是部署还是仅为localhost:<port>。 - Jose Ignacio Ochoa
当我没有使用Docker时,如何找到我的Kestrel证书? - theonlygusti

3
我在60分钟内解决了这个问题。
你可能同时安装了两个。
Microsoft.AspNetCore.Authentication.JwtBearer

并且

System.IdentityModel.Tokens.Jwt

然后,你会遇到这个非常奇怪的问题。
所以,答案是移除 System.IdentityModel.Tokens.Jwt

太棒了,它真的有效!非常感谢你! - undefined

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