【问题标题】:Use two JWT Authentication Scheme, ASP.NET Core 3.1使用两个 JWT 身份验证方案,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://stackoverflow.com/a/49706390/11593189

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

【问题讨论】:

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

标签: c# .net authentication asp.net-core jwt


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-10-01
    • 1970-01-01
    • 2018-02-23
    • 2019-09-06
    • 2021-04-20
    • 2017-10-03
    • 2020-05-25
    • 2019-05-25
    • 2018-09-02
    相关资源
    最近更新 更多