如何解决:“ InvalidOperationException:IDX20803:无法从以下位置获取配置:[[PII被隐藏]”

时间:2019-01-30 07:44:58

标签: c# docker asp.net-core identityserver4

我已经在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)

10 个答案:

答案 0 :(得分:11)

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

我正在跟踪Identity Server 4的示例,问题是Identity Server 4的快速入门示例包含3个项目:

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

在提供的示例中,将Identity Server设置为https,端点为https://localhost:5001。 但是该机构位于“消费者Api”中,设置为http://localhost:5000

因此,当客户端尝试连接到Consumer Api时,它将获得http://localhost:5000地址并尝试查看http://localhost:5000/.well-known/openid-configuration,但这不存在。它仅存在于https://localhost:5001/.well-known/openid-configuration上。

到目前为止一切顺利。

解决方案是确保您在消费者授权机构上使用身份服务器的相同终结点:

options.Authority = "https://localhost:5001";

答案 1 :(得分:5)

如果有人在开发过程中遇到此问题,我可以通过清除开发人员证书然后重新创建来解决此问题。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

该解决方案非常棘手,我知道这是一个老问题,但是上周我遇到了完全相同的问题,并且花了很多时间来解决它。 此问题是因为“客户端”应用不信任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

最后,在客户端应用程序的权限中,请确保要访问正确的域并且应该可以正常工作。

希望对您有帮助!

答案 4 :(得分:1)

对我来说,我启用了 IdentityModelEventSource.ShowPII 并知道众所周知的 url 不正确。 @Mentor 的回答很有帮助

答案 5 :(得分:0)

启用TLS 1.2解决了该问题

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

答案 6 :(得分:0)

如果这与使用“连接到云中的现有商店”又称为“ Azure Active Directory B2C”的Visual Studio Web应用程序项目有关,则建议的配置不好。

更改

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

收件人

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

  1. 为开发域生成一个免费的 lets Encrypt 证书,
  2. 使用 let encrypt files 生成 pfx 文件和密码:.box2:hover { display:block; }
  3. 设置 Kestrel 以使用这些证书和密码。像这样的例子:microsoft
  4. 完成

答案 9 :(得分:0)

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

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