Web API 身份用户与 JWT 在两个 API 上共享相同的 Auth 参数

Web API Identity User with JWT on two API's sharing the same Auth params

我真的很难找到这个问题的答案。我创建了一个正在运行的注册 WebApi。我可以注册一个用户,再注册一个角色,登录并接收回一个 JWT。此 api 将在线托管以允许用户访问我的页面。

前端是一个 Blazor Web Assembly 应用程序。这也与另一个 API 通信,此 API 安装在本地客户端计算机上,允许与另一个应用程序通信。

其中很多调用本地 api 需要授权。

这是我真正努力寻找答案的部分。

我如何让这个 API 对另一个 API 提供的 JWT 进行授权。我找到的所有文档都将这些功能捆绑在一起。

我尝试了什么? 我已尝试向此本地 api 添加相同的身份验证属性,但看来我还需要为其提供对数据库的访问权限以供其构建,这当然不理想且似乎不正确。

如果有人能给我一些指点,那就太好了!

要向另一个 API 验证请求,API 必须使用与签名相同的秘密验证令牌。

因此,如果您使用以下方式发行令牌:

var jwtHandler = new JwtSecurityTokenHandler();

var accessToken = jwtHandler.CreateJwtSecurityToken(
    issuer: _environment.ApplicationName,
    audience: _environment.ApplicationName,
    subject: principal.Identities.First(),
    expires: DateTime.Now.AddMinutes(_options.ExpirationMinutes),
    signingCredentials: _options.SigningCredentials // <-- key used to sign the token
);

其他服务必须使用相同的密钥对其进行验证:

services.AddAuthentication(/*...*/).AddJwtBearer(options =>
{
    options.TokenValidationParameters = new TokenValidationParameters
    {
        // ValidateIssuer = false,
        // ValidateAudience = false,
        ValidateIssuerSigningKey = true, // <--
        IssuerSigningKey = jwtOptions.SigningCredentials.Key, // <-- same key
    };
});

您唯一真正需要在应用之间共享的是签名密钥。

但如果您要处理更多应用程序,这并不理想。你愿意和他们所有人分享钥匙吗?你可能会,但如果你需要重置密钥会发生什么?您必须在所有应用中重置它。

对于这些情况,更好的解决方案是将令牌签名委托给单独的服务,例如身份服务器(或任何其他 OIDC 提供商),然后在所有应用程序中使用并验证该服务颁发的令牌。