Web API 中的多个 JWT 授权令牌

Posted

技术标签:

【中文标题】Web API 中的多个 JWT 授权令牌【英文标题】:Multiple JWT authorization token in Web API 【发布时间】:2021-11-21 11:05:38 【问题描述】:

我有一个使用 .Net Core 5 开发的 Web API 应用程序,我使用 OIDC 2 实现了授权,因此使用了 JWT 不记名令牌。

现在我需要将此应用程序放在公司 API 网关后面,该网关充当代理,需要额外授权。 因此,请求应该有两个授权令牌,一个用于 API 网关,另一个用于应用程序本身。

网关管理员告诉我修改我的代码以处理如下请求:

curl -X GET "https://api-gateway.some-domain.org/my-application/some-endpoint" 
     -H "accept: application/json" 
     -H "MyApp-Authorization: Bearer JGVFISOODISJ..." 
     -H "Authorization: Bearer FVJIDOSJFMDSIO..."

我从管理员的回复中了解到,我应该修改它在我的应用程序中配置身份验证的方式,可能在启动文件中。

目前我的配置方式如下:


public void ConfigureServices(IServiceCollection services)


    //...

    //Add ASP.NET Core Identity Services
    services.AddIdentity<IdentityUser, IdentityRole>()
            .AddEntityFrameworkStores<RPToolDBContext>()
            .AddSignInManager<SignInManager<IdentityUser>>();
    
    var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(appSettings.Secret));
    
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(opt =>
            
                opt.TokenValidationParameters = new TokenValidationParameters
                
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = key,
                    ValidateAudience = false,
                    ValidateIssuer = false,
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.Zero
                ;
            )
            .AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));
    //...


要修改属性名称,我需要更改哪些内容?

显然,我认为我还需要更改前端的代码,该代码是使用 MSAL 库在 REACT 中开发的,以便使用新的标头...

【问题讨论】:

如果我的问题正确,网关将需要额外的身份验证,这将验证标头本身,如果一切正常,那么请求将传递给我们的应用程序对吗?那么为什么我们的应用程序要处理 2 种类型的 Jwt(因为一种是特定于网关的?)。那么如果我们必须以某种方式同时处理 2 种类型的 Jwt,如果它们的内容完全不同会发生什么?像一个给鲍勃,一个给爱丽丝? 【参考方案1】:

如果像这样工作,从良好的安全性和简单的代码标准的角度来看,这种模式可能是好的:

不可读格式的机密访问令牌会发给 Web 和移动客户端,因此不会泄露敏感数据

API 接收包含声明和范围的 JWT,然后将它们用于授权,包括所需的所有用户上下文

当客户端调用 API 时,消息通过网关路由,网关将机密令牌交换为 JWT

行业标准

在我的公司,我们称之为The Phantom Token Pattern。值得看看您是否可以将事情引向这个方向 - 例如,如果您与建筑师合作,请将我的答案转发给建筑师。

您的 API 不必使用 2 种类型的令牌或非标准标头值,因为这意味着安全库无法工作。

自定义身份验证器

作为最后的手段,您可以自定义 .Net 并以不同的方式检索令牌。一些sample code of mine 展示了如何自定义.Net 堆栈,但仅用于学习目的。最好让您的安全代码保持简单和标准。

【讨论】:

以上是关于Web API 中的多个 JWT 授权令牌的主要内容,如果未能解决你的问题,请参考以下文章

JWT 不记名令牌授权应用于 .NET Core 中的现有 MVC Web 应用程序

JWT不记名令牌授权不起作用asp net core web api

.NET Core 2 Web API JWT 令牌无法识别

Web Api JWT 令牌认证

如何从节点 api 中的获取请求中解码 JWT 令牌

NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)