如何在 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 中选择了哪个单选按钮

如何在 asp.net core 中使用 ajax 创建评论列表? [关闭]

在 ASP.Net 5 / Core 中启用跨域资源共享 (CORS)