我有一个配置为发布和验证 JWT 不记名令牌的 ASP.Net Core 应用程序。当站点托管在 Kestrel 中时,客户端能够成功检索不记名令牌并使用令牌进行身份验证。
我还有一套使用 Microsoft.AspNetCore.TestHost.TestServer 的集成测试。在添加身份验证之前,测试能够成功地向应用程序发出请求。添加身份验证后,我开始收到与访问开放 ID 配置有关的错误。我看到的具体例外是:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://
fail: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[3]
Exception occurred while processing message.
System.InvalidOperationException: IDX10803: Unable to obtain configuration from: 'http://localhost/.well-known/openid-configuration'. ---> System.IO.IOException: IDX10804: Unable to retrieve document from: 'http://localhost/.well-known/openid-configuration'. ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 404 (Not Found).
根据我的研究,当权威设置为与托管服务器不同的主机时,有时会触发这种情况。例如,Kestrel 默认在http://localhost:5000运行,这是我最初设置的权限,但是在将其设置为 TestServer 正在模拟的 ( http://localhost ) 时,它仍然给出相同的错误. 这是我的身份验证配置:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
RequireHttpsMetadata = false,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateAudience = true
},
Audience = "Anything",
Authority = "http://localhost"
});
奇怪的是,尝试直接从集成测试中访问 URL 可以正常工作:
那么如何配置 ASP.Net TestServer 和 OpenId Connect 基础架构以协同工作?
=== 编辑 ====
稍微反思一下,我想到问题是 JWT 授权内部正在尝试向http://localhost端口 80 发出请求,但它并没有尝试使用 TestServer 发出请求,而是因此寻找一个真正的服务器。由于没有,它永远不会进行身份验证。看起来下一步是看看是否有某种方法可以关闭权威检查或以某种方式扩展基础设施以允许它使用 TestServer 作为主机。