使用两个 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
需要 Schema1
而Method2
需要Schema2
【讨论】:
以上是关于使用两个 JWT 身份验证方案,ASP.NET Core 3.1的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core JWT/Windows 身份验证 HTTP 400 错误
ASP.NET 5 中使用 OAuthBearerAuthentication 的 JWT 身份验证
ASP.NET Core API 使用 JWT 不记名令牌进行身份验证