我正在尝试使用 Ocelot 在 ASP.Net API 网关中获得 JWT 不记名身份验证,以与多个授权机构/颁发者合作。一个发行者是Auth0,另一个是基于IdentityServer4的内部认证服务器;我们正在尝试从 Auth0 迁移,但仍有外部客户端依赖它,因此我们希望同时支持这两种客户端,直到一切都经过全面测试以供切换。
根据this MSDN blog post,应该可以通过设置TokenValidationParameters.ValidIssuers
而不是使用多个权限JwtBearerOptions.Authority
。但是,我已经在使用和不使用 Ocelot 的情况下对此进行了测试,如果没有将授权设置为颁发令牌的授权,则不会发生身份验证,无论TokenValidationParameters.ValidIssuers
.
有谁知道如何让这个工作?这就是我设置身份验证的方式。它仅在注释行未注释时才有效(并且仅适用于由该单一机构颁发的令牌)。我期待 Ocelot 或 ASP.Net Core 从发布服务器获取密钥;两者都通过 .well-known/openid-configuration 提供 JWK,它与 ASP.Net Core 中间件一起使用。
public static void AddJwtBearerAuthentication(this IServiceCollection services, IConfiguration configuration)
{
services
.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
//options.Authority = configuration["Jwt:Authority"];
options.Audience = configuration["Jwt:Audience"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidAudience = configuration["Jwt:Audience"],
ValidIssuers = configuration
.GetSection("Jwt:Authorities")
.AsEnumerable()
.Select(kv => kv.Value)
.Where(s => !string.IsNullOrEmpty(s))
.ToArray()
};
});
}
当有错误发行者的客户端(或当我们使用TokenValidationParameters.ValidIssuer
/时ValidIssuers
)连接时,Ocelot 的输出是:
[16:35:37 WRN] requestId: _____, previousRequestId: no previous request id, message: Error Code: UnauthenticatedError Message: Request for authenticated route _____ by was unauthenticated errors found in ResponderMiddleware. Setting error response for request path:_____, request method: POST
这是一个 client_credentials 身份验证,因此在“by”之后缺少用户名。正如您所看到的,Ocelot 并没有说明确切的问题是什么。ASP.Net Core JWT 承载中间件(没有 Ocelot)只是说签名无效。我怀疑它要么没有看TokenValidationParameters
,要么我误解了它们的目的。