首页 > 解决方案 > 使用 JWT 的 Web API 身份用户在两个 API 上共享相同的 Auth 参数

问题描述

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

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

很多对本地 api 的调用都需要授权。

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

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

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

如果有人可以给我一些指示,那就太棒了!

标签: c#asp.netasp.net-web-apiasp.net-identityasp.net-core-webapi

解决方案


要使用其他 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
    };
});

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

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

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


推荐阅读