我正在尝试使用Ocelot在ASP.Net API网关中实现JWT承载身份验证,以便与多个授权机构/颁发者一起使用。一个颁发者是Auth0,另一个是基于IdentityServer4的内部身份验证服务器;我们试图摆脱Auth0,但仍有外部客户端依赖它,因此我们希望支持两个,直到一切都为他们完全测试并且可以切换。
根据这篇 MSDN 博客文章,可以通过设置TokenValidationParameters.ValidIssuers
而不是JwtBearerOptions.Authority
来使用多个授权机构。然而,我已经使用和没有使用Ocelot进行了测试,如果Authority没有设置为颁发令牌的颁发机构,就不会进行任何身份验证,无论TokenValidationParameters.ValidIssuers
的内容如何。
有人知道如何让它工作吗?这是我的身份验证设置方式。只有取消注释的那一行才起作用(并且仅适用于由该单个机构颁发的令牌)。我期望Ocelot或ASP.Net Core从颁发服务器获取密钥;两者都通过.well-known/openid-configuration提供JWKs,这对于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 的输出如下:
当客户端使用错误的颁发者或者我们使用 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身份验证,因此在“通过”之后没有用户名。正如您所看到的,Ocelot没有说明确切的问题所在。ASP.Net Core JWT承载中间件(不带Ocelot)只说签名无效。我怀疑它要么没有查看TokenValidationParameters
,要么我误解了它们的目的。