c# - 使用 JWT 的 Web API 身份用户在两个 API 上共享相同的 Auth 参数
问题描述
我真的很难找到这个问题的答案。我创建了一个正在运行的注册 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
};
});
您真正需要在应用程序之间共享的唯一内容是签名密钥。
但是,如果您要处理更多应用程序,这并不理想。你会和他们所有人共享密钥吗?您可能会,但是如果您需要重置密钥会发生什么?您必须在所有应用程序中重置它。
对于这些情况,更好的解决方案是将令牌签名委托给单独的服务,例如 Identity Server(或任何其他 OIDC 提供程序),然后在所有应用程序中使用并验证该服务发布的令牌。
推荐阅读
- c - 一个使用 scanf 读取整数但如果输入字母会崩溃的函数
- etl - 在 tUnite 组件后添加记录 Progressive Number
- java - 如果哈希码大于映射大小,哈希映射如何找到存储桶?
- java - 带有 Weka 命令行的 ProcessBuilder/Runtime.exec() 演示特殊行为
- python - 对于关键字的每个实例,在特定关键字之后提取第一次出现的数字(Python)
- sql - 将具有多个返回数据的行移动到列以确保 SQL Server 中的结果只有一行
- batch-file - 批量删除子文件夹中的文件,文件名中有空格
- r - 在条形图ggplot2中添加数字
- r - 如何根据变量的类拆分数据框列表?
- github - 无法使用空密码将 SSH 密钥添加到 ssh-agent (Bitrise CLI)