如何在 ASP.NET Core 5 中使用 AuthenticationBuild.AddJwtBearer() 执行 JWT 颁发者验证时添加参数
Posted
技术标签:
【中文标题】如何在 ASP.NET Core 5 中使用 AuthenticationBuild.AddJwtBearer() 执行 JWT 颁发者验证时添加参数【英文标题】:How to add a parameter when performing JWT issuer-validation in ASP.NET Core 5 with AuthenticationBuild.AddJwtBearer() 【发布时间】:2021-11-19 09:24:00 【问题描述】:我正在使用 Azure Active Directory B2C 提供商提供的外部生成的 JWT 对我的 API 用户进行身份验证。当我尝试使用有效的 JWT 进行身份验证时,我收到以下堆栈跟踪错误:
System.InvalidOperationException: IDX20803: Unable to obtain configuration from:
'https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/.well-known/openid-configuration'
在底部显示的代码中,addJwtBearer()
方法将颁发者 URL 作为其参数之一。当它执行颁发者验证时,它会添加一个/.well-known
后缀。
// Original
"https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/"
// With suffix
"https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/.well-known/openid-configuration"
问题是端点需要一个额外的参数,即 AD 用户流 ID,来执行验证,如下所示:
//Correct address, with paramter
"https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/.well-known/openid-configuration?p=B2C_1_ropc"
//Sent address
"https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/.well-known/openid-configuration"
如果我尝试在原始 URL 中添加参数,后缀仍然会添加到参数之后,这会导致 URL 格式错误。关于如何克服这个问题的任何建议?随时要求澄清我的睡眠不足的疯狂:)
Startup.cs
public void ConfigureServices(IServiceCollection services)
...
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearerConfiguration(
"https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/",
"<audience_id>"
);
...
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
...
app.UseAuthentication();
app.UseAuthorization();
...
JwtConfig.cs
public static AuthenticationBuilder AddJwtBearerConfiguration(this AuthenticationBuilder builder, string issuer, string audience)
return builder.AddJwtBearer(options =>
options.Authority = issuer; // https://<blade_id>.b2clogin.com/<tenant_id>/v2.0/
options.Audience = audience;
options.TokenValidationParameters = new TokenValidationParameters()
ClockSkew = new System.TimeSpan(0, 0, 30)
;
// Code for handling challenges
...
【问题讨论】:
可能重复of this question 【参考方案1】:您真的不想在 2021 年使用 JWT,也不应该将其传递给您的 API 使用者。现代微服务架构不应受到单点故障的影响,您需要使用安全、分散且与开发人员无关的安全令牌。
Here 是一篇描述最佳实践微服务安全模式的文章,您将从学习中受益,here 您可以找到 PASETO 的参考 php 实现,这是一种现代微服务安全令牌。我鼓励您研究这些资源,因为您的 API 客户端不必继承您的实现复杂性。 Here 是我在 Rust 编程语言中的 memory safe 实现 PASETO。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:在 appsettings.json 文件中指定“Issuer”的值。
"Jwt":
"Issuer": "https://localhost:44341"
,
使用 JWT 承载选项配置身份验证架构。
public void ConfigureServices(IServiceCollection services)
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
options.TokenValidationParameters = new TokenValidationParameters
ValidateIssuer = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration["Jwt:Issuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"]))
;
);
services.AddMvc();
更多信息请参考JWT Authentication。
【讨论】:
以上是关于如何在 ASP.NET Core 5 中使用 AuthenticationBuild.AddJwtBearer() 执行 JWT 颁发者验证时添加参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Web API Asp.NET Core 5 中持久化常用数据?
如何在 ASP.NET Core 5 中使用 AuthenticationBuild.AddJwtBearer() 执行 JWT 颁发者验证时添加参数
如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?
如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮