net核心web api JWTBear中间件如何验证OpenID连接令牌与身份验证提供程序

net核心web api JWTBear中间件如何验证OpenID连接令牌与身份验证提供程序,jwt,asp.net-identity,keycloak,openid-connect,idp,Jwt,Asp.net Identity,Keycloak,Openid Connect,Idp,几天来我一直把头撞在墙上。解决方案可能太简单了,无法在博客中陈述,因此我在这里提出了一个问题 我正在开发一个.NET核心Web API,它应该将所有身份验证和授权委托给KeyClope身份提供程序服务器 我在Startup.cs文件中编写了以下代码: services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults

几天来我一直把头撞在墙上。解决方案可能太简单了,无法在博客中陈述,因此我在这里提出了一个问题

我正在开发一个.NET核心Web API,它应该将所有身份验证和授权委托给KeyClope身份提供程序服务器

我在
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的公共URL发出请求以获得一些配置

问题:
如果Web API对IDP一无所知,它如何知道令牌是有效的,而不是被篡改的(使用不同的密钥创建的)?

AddJWTBearner将使用您给它的选项来执行令牌的内存验证。默认情况下,这涉及以下操作:

  • 验证发行人
  • 验证受众
  • 检查令牌的exp声明是否在过去(过期)
  • 验证访问令牌的数字签名
第四个检查是最复杂的,默认情况下,这涉及从IDP的JWKS端点下载令牌签名公钥,然后在JWT的kid头中选择一个。我的一位同事有一些关于如何工作的细节

当然,您应该始终测试上述4个条件,并确保在每种情况下,API访问都会被拒绝,客户端可以根据401错误响应进行编码