【发布时间】:2020-11-25 02:17:51
【问题描述】:
我一直在实施 IdentityServer4 来为我的 Angular 应用程序提供授权。我在我的本地开发环境中工作,但是在 Docker 容器中运行时遇到了问题。我可以通过 /connect/token 端点生成访问令牌,但是当我尝试使用该令牌访问受保护的 API 时,出现以下异常:
System.InvalidOperationException:IDX20803:无法从“System.String”获取配置。 System.IO.IOException:IDX20804:无法从以下位置检索文档:“System.String” System.Net.Http.HttpRequestException:无法分配请求的地址 System.Net.Sockets.SocketException (99):无法分配请求的地址 在 System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32 端口,CancellationToken 取消令牌)
我认为这可能在某处验证失败,但我尝试将所有这些选项设置为 false,但没有任何效果:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = this.Configuration.SiteUrl;
options.RequireHttpsMetadata = this.Configuration.SiteUrl.StartsWith("https://");
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = Claims.Username,
RoleClaimType = Claims.Role,
RequireExpirationTime = true,
ClockSkew = TimeSpan.FromMinutes(1),
ValidateActor = false,
ValidateTokenReplay = false,
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = false,
ValidateIssuerSigningKey = false
};
});
如果重要的话,我的测试是在容器内部和外部使用非 https 的 Configuration.SiteUrl 值进行的,所以这不是罪魁祸首。我真的不认为这是一个配置问题,因为它成功生成了令牌,并且相同的代码在 Docker 容器之外正常工作。
Configuration.SiteUrl 在 Docker 容器中设置为 http://localhost:8077。对 http://localhost:8077/.well-known/openid-configuration 的请求会返回正确的响应。根据错误消息,我认为它可能出于某种原因向容器内的端口 8077 发出请求,但是当我尝试将设置设置为 http://localhost:80 时没有任何变化(因为在容器内使用了端口 80)。
任何识别/解决问题的帮助将不胜感激,因为我已经为此苦苦挣扎了几个小时。
【问题讨论】:
标签: c# asp.net identityserver4