无法从已知的/ openid-configuration 中获取配置

19

我正在使用ASP.NET 5,我的解决方案中有Web API、Identity Server和Angular 2项目,我通过使用Identity Server来验证Angular 2客户端,Angular 2客户端通过在http请求中传递令牌来消耗Web API,并且Web API对令牌进行身份验证并返回响应,为此我编写了一个自定义属性来检查用户是否已通过身份验证

当我使用API时,我遇到以下异常,Web API返回500内部服务器错误。

System.InvalidOperationException: IDX10803: 无法从以下位置获取配置:http://xx.xx.xx.x:3926/.well-known/openid-configuration。 ---> System.IO.IOException: IDX10804: 无法从以下位置检索文档:http://xx.xx.xx.x:3926/.well-known/openid-configuration。 ---> System.AggregateException: 发生了一个或多个错误。---> System.Net.Http.HttpRequestException: 发送请求时发生错误。---> System.Net.WebException: 无法连接到远程服务器---> System.Net.Sockets.SocketException: 连接尝试失败,因为已连接的方在一段时间后没有正确反应,或者由于已连接的主机没有响应而导致连接失败:xx.xx.xx.x:3926 at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)


你的 WebAPI 是否可以访问身份验证服务器?也就是说,你是否可以在 WebAPI 环境中访问 URL /.well-know/openid-configuration? - Karthik
感谢您的回复, 是的。 - amol
我们已经创建了一个API方法,使用“/.well-know/openid-configuration”URL获取配置信息。 如果我们直接从浏览器或其他应用程序(使用jQuery AJAX GET调用)尝试访问此API方法,它会给我们正确的响应。 - amol
系统上是否配置了代理?当应用程序部署到IIS时,它将无法访问用户配置的代理。您需要在OpenIdConnectOptions.BackchannelHttpHandler上设置它。 - Tratcher
听起来服务器要么没有运行,要么您已经禁用了元数据端点。 - Brock Allen
似乎也和这个问题相似:https://dev59.com/Opfga4cB1Zd3GeqPDfQp - Brock Allen
11个回答

20

我用了类似这样的东西,解决了我的问题。

services.AddAuthentication(o => {
            o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })            
        .AddCookie(cfg => cfg.SlidingExpiration = true)
        .AddJwtBearer(cfg =>
        {
            cfg.Audience = "http://localhost:4200/";
            cfg.Authority = "http://localhost:5000/";
            cfg.RequireHttpsMetadata = false;
            cfg.SaveToken = true;
            cfg.TokenValidationParameters = tokenValidationParameters;
            cfg.Configuration = new OpenIdConnectConfiguration();  <-- Most IMP Part
        });

2
工作正常,答案很棒。 - Sayed Azharuddin
你能详细说明一下tokenValidationParameters吗?我也做了同样的事情,但Authorize属性没有起作用。 - Saif
@Saif 我不确定当时我用的是什么,但你可以看看这个链接 https://dev59.com/W1cO5IYBdhLWcg3whR7M#45723392 - Bharat
4
你提到的“最重要的部分”对我来说非常重要。非常感谢你。 - Suyon Won
尽情享受吧,Suyon。 :) - Bharat
4
cfg.Configuration = new OpenIdConnectConfiguration(); 问题已解决。 - nouman

16
如果IdentityServer和访问令牌验证中间件被托管在同一个应用程序中,则会在启动时出现竞争条件。
验证中间件尝试加载尚不可用的发现文档。
在这些情况下,将验证中间件上的DelayLoadMetadata标志设置为true。
如果完全禁用发现终结点,则需要在验证选项上配置发行者和密钥材料。

很好,这解决了我的问题。谢谢您迅速的回复。现在我的授权和认证已嵌入到我的资源服务器中。 - ad0ran
这也解决了我的问题。应该标记为答案。谢谢! - Martin Johansson
5
验证中间件在哪里? - Moritz Schmidt
16
请问您能否说明在哪里设置DelayLoadMetadata?我找不到它的位置! - ajb101
请问有人可以添加在哪里找到“DelayLoadMetadata”配置的信息吗?谢谢。 - Andre
1
请参见:https://dev59.com/Opfga4cB1Zd3GeqPDfQp - shlgug

7
这个错误的原因是代理问题,可以通过实施以下代码解决:
options.BackchannelHttpHandler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator,
                Proxy = new WebProxy(Configuration["System:Proxy"])
            };

如果您看到“无法从以下位置检索文档:'[pii is hidden]'”,则需要将以下内容添加到ConfigureServices中:
    public void ConfigureServices(IServiceCollection services)
            {
......
IdentityModelEventSource.ShowPII = true;
    }

我希望这能有所帮助。

IdentityModelEventSource.ShowPII = true; 确实对于我在 .Net 6.0 - API - JWT Bearer / Identity 情况下调试类似的“无法从...检索文档”的错误非常有帮助。 - Ian W

2
在我的情况下,我缺少了这个:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...
    app.UseIdentityServer();
    ...
}

1

请检查您的appsettings.json租户ID,并确保您没有意外复制超过所需租户ID的内容。


0

0
我因为几个原因而收到了这个错误信息。 其中一个问题是在 @leastprivilege 的回答下得以解决。 另一个问题是我的 Identity Server 项目中的证书文件在版本控制中丢失了。所以我只需用原始文件替换损坏的文件,然后它就可以工作了。

0
重新构建我的SSO项目解决了我的问题。在重建项目期间,Nuget包也得到了恢复。希望这能帮到你。

0
我在本地测试时遇到了这个问题,使用dotnet run命令。对/.well-known的调用在错误的端口上执行。在我的启动类中添加了一行代码后,问题得到解决。

enter image description here


0

通过将应用程序池身份从“Applicationpoolidentity”更改为“内置帐户”,成功解决了问题。在内置帐户服务帐户名称和密码中给出。


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