.net core web api jwtbearer 中间件如何使用身份验证提供程序验证 OpenID Connect 令牌
How does .net core web api jwtbearer middleware verify OpenID Connect token with authentication provider
这几天我一直在用头撞墙。解决方案可能太简单了,无法在博客中说明,所以我在这里提出问题。
我正在开发一个 .NET Core Web API,它应该将所有身份验证和授权委托给 Keycloak 身份提供程序服务器。
我在 Startup.cs
文件中编写了以下代码:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.Authority = "https://idp.abc.xyz/auth/realms/master";
o.Audience = "products-api";
});
services.AddAuthorization(options =>
{
options.AddPolicy("Administrator", policy => policy.RequireClaim("user_roles", "product_catalog_admin"));
options.AddPolicy("User", policy => policy.RequireClaim("user_roles", "product_catalog_user"));
});
现在我可以使用 Postman 从 IDP 请求令牌并将该令牌发送到 Web API。然后 Web API 验证该令牌,但除了 URL 之外不知道关于 IDP 的任何信息,并且只向 IDP 的 public URL 发出请求以获取一些配置。
问题:
如果 Web API 对 IDP 一无所知,它如何知道令牌有效且未被篡改(使用不同的密钥创建)?
AddJwtBearer 将使用您提供的选项在内存中执行令牌验证。默认情况下,这涉及以下操作:
- 验证发行人
- 验证观众
- 检查令牌的exp声明是否在过去(过期)
- 验证访问令牌的数字签名
第 4 次检查是最复杂的,默认情况下这涉及从 IDP 的 JWKS 端点下载令牌签名 public 密钥,然后在 JWT 的孩子 header 中选择一个。我的 blog post 详细介绍了它的工作原理。
当然,您应该始终测试上述 4 个条件,并确保在每种情况下 API 访问都被拒绝并返回 401 错误响应,客户端可以针对该响应进行编码。
这几天我一直在用头撞墙。解决方案可能太简单了,无法在博客中说明,所以我在这里提出问题。
我正在开发一个 .NET Core Web API,它应该将所有身份验证和授权委托给 Keycloak 身份提供程序服务器。
我在 Startup.cs
文件中编写了以下代码:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(o =>
{
o.Authority = "https://idp.abc.xyz/auth/realms/master";
o.Audience = "products-api";
});
services.AddAuthorization(options =>
{
options.AddPolicy("Administrator", policy => policy.RequireClaim("user_roles", "product_catalog_admin"));
options.AddPolicy("User", policy => policy.RequireClaim("user_roles", "product_catalog_user"));
});
现在我可以使用 Postman 从 IDP 请求令牌并将该令牌发送到 Web API。然后 Web API 验证该令牌,但除了 URL 之外不知道关于 IDP 的任何信息,并且只向 IDP 的 public URL 发出请求以获取一些配置。
问题: 如果 Web API 对 IDP 一无所知,它如何知道令牌有效且未被篡改(使用不同的密钥创建)?
AddJwtBearer 将使用您提供的选项在内存中执行令牌验证。默认情况下,这涉及以下操作:
- 验证发行人
- 验证观众
- 检查令牌的exp声明是否在过去(过期)
- 验证访问令牌的数字签名
第 4 次检查是最复杂的,默认情况下这涉及从 IDP 的 JWKS 端点下载令牌签名 public 密钥,然后在 JWT 的孩子 header 中选择一个。我的 blog post 详细介绍了它的工作原理。
当然,您应该始终测试上述 4 个条件,并确保在每种情况下 API 访问都被拒绝并返回 401 错误响应,客户端可以针对该响应进行编码。