使用两个 JWT 身份验证方案,ASP.NET Core 3.1

Posted

技术标签:

【中文标题】使用两个 JWT 身份验证方案,ASP.NET Core 3.1【英文标题】:Use two JWT Authentication Scheme, ASP.NET Core 3.1 【发布时间】:2020-07-27 14:39:25 【问题描述】:

我想要不同的 JWT 认证不同的控制器方法。

Startup.cs 看起来像:

            services
            .AddAuthentication()
            .AddJwtBearer("Schema1", options =>
            
                ...
                // use JWT Authentication with secretKey1
                var issuerSecretKey = "secretKey1";
                options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(
                    Encoding.ASCII.GetBytes(issuerSecretKey));
            )
            .AddJwtBearer("Schema2", options =>
            
                ...
                // use JWT Authentication with secretKey2

                var issuerSecretKey = "secretKey2";
                options.TokenValidationParameters.IssuerSigningKey = new SymmetricSecurityKey(
                    Encoding.ASCII.GetBytes(issuerSecretKey));
            );

        services.AddAuthorization(options =>
        
            options.DefaultPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddAuthenticationSchemes("Schema1", "Schema2")
                .Build();
        );

控制器

[Authorize(AuthenticationSchemes = "Schema1")]
public ActionResult Method1(int id) 
 
  //some code 



[Authorize(AuthenticationSchemes = "Schema2")]
public ActionResult Method2(int id) 
 
  //some code 

之后我带着Postman,通过secretKey2用JWT执行对Method1的请求,但它成功通过了授权! 我用这个答案https://***.com/a/49706390/11593189

secretKey1使用JWT授权Method1,secretKey2使用JWT授权Method2怎么办? 也许我应该使用其他机制,例如 Policy 或 Role?

【问题讨论】:

根据this github issue,认证方案是区分大小写的,尝试在Authorize Attribute中将“schema2”改为“Schema2” 对不起,我被封了。我在控制器中使用 Schema1 和 Schema2 【参考方案1】:

您可以像这样使用AddPolicy 为每个Policy 添加所需的方案

.AddAuthorization(options =>
            
                options.AddPolicy("Policy1", policy =>
                 
                     policy.AddAuthenticationSchemes("Schema1");
                     policy.RequireAuthenticatedUser();
                 );
                options.AddPolicy("Policy2", policy =>
                 
                     policy.AddAuthenticationSchemes("Schema2");
                     policy.RequireAuthenticatedUser();
                 );
            );            

然后在Authorize 属性中使用Policy 而不是AuthenticationSchemes

[Authorize(Policy = "Policy1")]
public ActionResult Method1(int id) 
 
  //some code 


[Authorize(Policy = "Policy2")]
public ActionResult Method2(int id) 
 
  //some code 

在这种情况下,Method1 需要 Schema1Method2 需要Schema2

【讨论】:

以上是关于使用两个 JWT 身份验证方案,ASP.NET Core 3.1的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core JWT/Windows 身份验证 HTTP 400 错误

ASP.NET 5 中使用 OAuthBearerAuthentication 的 JWT 身份验证

ASP.NET Core JWT 身份验证受众属性

ASP.NET Core API 使用 JWT 不记名令牌进行身份验证

在 ASP.Net 应用程序上结合 ADFS 身份验证和 JWT 承载

使用 ASP.NET 标识和 JWT 令牌的 Azure 函数身份验证