"InvalidOperationException: IDX20803: Unable to obtain configuration from: '[PII is hidden]'"



我已经在 Docker 上部署了我的 API 和客户端应用程序,但在我的一生中,Web 应用程序无法调用 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)

我们需要启用 PII 日志的查看,以便查看有关错误的更多详细信息: 将 ConfigureServices() 中的以下行添加到 Startup.cs

public void ConfigureServices(IServiceCollection services)
{
IdentityModelEventSource.ShowPII = true; //Add this line
....

就我而言,这发生在我在本地主机环境中使用身份服务器开发身份原型时,并且我的权限配置不正确。

我正在遵循身份服务器 4 的示例,问题是身份服务器 4 的快速入门示例包含 3 个项目:

  • 身份服务器。 端点 =>https://localhost:5001
  • API(称为资源 API 或消费者 API)。
  • 客户。

在提供的示例中,身份服务器设置为具有端点 https://localhost:5001 的 https。 但管理局在消费者 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";

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

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

启用 TLS 1.2 解决了这个问题

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

在 .NET 6 中,在Program.csbuilder后添加代码。例:

using Microsoft.IdentityModel.Logging;
var builder = WebApplication.CreateBuilder(args);
IdentityModelEventSource.ShowPII = true;

对我来说,错误是:

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

这里的解决方案:

https://stackoverflow.com/a/70925127/3850405

如果这与Visual Studio Web应用程序项目有关,使用"连接到云中的现有存储"又名"Azure Active Directory B2C"建议的配置,那就不好了。

它还需要更改 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}"
}

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

当身份服务器未运行时,也会发生此错误。

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

在客户端应用程序的 Dockerfile 上,您应该添加类似这样的内容,以便将 API 应用程序上使用的证书添加到客户端的受信任 CA 中。

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

这里有很大的注意!(至少在本地环境中)您应该关心 API 证书的域。就我而言(本地环境),我必须创建一个多域证书,因为 API 的"本地主机"与客户端应用程序的"本地主机"不同,因为它们在不同的 docker 容器上运行。 话虽如此,对于 API 的 Kestrel 证书,我按照本指南 https://www.rpkamp.com/2014/08/25/setting-up-a-multi-domain-self-signed-ssl-certificate/和 DNS 部分的 .cnf 文件上创建了多域自签名证书,我做了这样的事情并做到了。

DNS.1 = localhost
DNS.2 = host.docker.internal

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

我希望它有所帮助!

在使用Blazor Server.Net 6中,我必须在应用程序之前添加 ShowPII 语句。在程序.cs中运行()。如果我把它加在 Main 的顶部,它不会有任何影响。我相信如果你愿意,你可以缩小一个更精确的位置,但这对我有用。

app.MapFallbackToPage("/_Host");
IdentityModelEventSource.ShowPII = true;
app.Run();

我的问题是 404 错误。

将 OIDC 与托管在 B2C 上的终结点一起使用,我将提供此规范性建议 - 在标识体验框架下的 B2C 门户中标识自定义策略,单击它,复制 OpenID Connect 发现终结点的 URL,并将其添加为选项。元数据地址值。URL 中需要"p"查询字符串值,该值只是策略名称。

就我而言,我预先创建了一个 B2C 实例和相关的应用程序条目,然后创建了一个新的 Web 应用程序,让 VS 带我完成新的 Web 应用程序Microsoft身份平台身份验证类型向导(实际上效果很好)。 默认的appsettings.json是这样的:

"AzureAd": {
"Instance": "https://xxxxxx.b2clogin.com/",
"Domain": "xxxxx.onmicrosoft.com",
"TenantId": "xxxxx",
"ClientId": "xxxxx",
"CallbackPath": "/signin-oidc",
"SignUpSignInPolicyId": "b2c_1_signin",
"SignedOutCallbackPath": "/signout/B2C_1_susi",
"ResetPasswordPolicyId": "b2c_1_reset",
"EditProfilePolicyId": "b2c_1_edit_profile",
"EnablePiiLogging": true},

修复它所需要的只是删除EnablePiiLogging行。

对我来说,我启用了IdentityModelEventSource.ShowPII,并知道众所周知的URL是不正确的。 这是@Mentor的非常有用的答案

如果您使用的是自签名证书并导入到受信任的根中,则 Microsoft CAPI2 可能会自动将其删除,因此 JWT 验证失败。 重新导入证书或在注册表中添加此条目: 密钥:HKLM\软件\策略\Microsoft\系统证书\身份验证根
名称: 禁用根自动更新 值:1 类型: REG_DWORD

就我而言,我使用的是 Azure AD 身份验证,但我的互联网未连接,连接互联网后它又开始工作了。和平

在 Linux 中,我尝试了所有建议的选项,但没有一个有效,我要做的就是:

  1. 为开发域生成免费的让加密证书,
  2. 使用"让文件加密:openssl pkcs12 -export -out ca-bundle.pfx -inkey private-key.key -in ca-bundle.crt生成 PFX 文件和密码
  3. 设置 Kestrel 以使用这些证书和密码。 像这个例子: 微软

我遇到了同样的错误,结果我忘了将app.UseIdentityServer();添加到StartUp.cs。将此方法添加到Cofigure()为我解决了问题。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//other config
app.UseIdentityServer();
}

<</div> div class="one_answers">只需在appsettings.json文件中添加以下配置:

"Instance": "https://login.microsoftonline.com/"

参考资料(Github):https://github.com/IdentityServer/IdentityServer4/issues/2337#issuecomment-458772667

我看到此错误是由于我的主机文件已损坏(Docker Desktop 添加了一个部分,但损坏了文件的原始内容)。这意味着我的身份服务器实例实际上未运行。

CounfigurationAuth方法中添加以下两行:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
IdentityModelEventSource.ShowPII = true;

对我来说它的工作

在我们的案例中,我们在开发环境中的 AzureAdB2C 的 SignUpSignInPolicyId 策略属性的微服务配置之一不匹配。

使用此配置的所有微服务

"AzureAdB2C": {
"Instance": "https://ourawesometenant.b2clogin.com",
"ClientId": "aa2cb23f-d25c-4c34-a7cc-847a2bf36377",
"Domain": "ourawesometenant.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_Default",
"AllowWebApiToBeAuthorizedByACL": true
}

因上述错误而失败的那个具有与其他微服务不同的 SignUpSignInPolicyId 值的此配置。

"AzureAdB2C": {
"Instance": "https://ourawesometenant.b2clogin.com",
"ClientId": "aa2cb23f-d25c-4c34-a7cc-847a2bf36377",
"Domain": "ourawesometenant.onmicrosoft.com",
"SignUpSignInPolicyId": "B2C_1_SignUp",
"AllowWebApiToBeAuthorizedByACL": true
}

确保所有微服务具有相同的 AzureAdB2C 配置可消除此错误。

我们在 Azure 应用服务上遇到此错误。我们需要确保允许通过 Azure 防火墙向终结点 https://login.microsoftonline.com/的流量。 我们的应用服务配置为使用路由表通过 VNet 通过 Azure 防火墙路由所有出站流量。

最新更新