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 令牌无法识别
NET Core 3.1 MVC 授权/身份验证,带有在单独的 Net Core 3.1 Web Api 中从外部获取的令牌 (JWT)