asp.net-core - 使用 OIDC 资源服务器保护 API
问题描述
我有 2 个 .NET 解决方案:一个 webapp,一个 API。当用户浏览 web 应用程序时,他需要进行身份验证,因此面临以下问题:
return builder.AddOpenIdConnect("contonso", options =>
{
options.Authority = configuration["Contonso:Oidc:Authority"];
options.ClientId = configuration["Contonso:Oidc:ClientId"];
options.ClientSecret = configuration["Contonso:Oidc:ClientSecret"];
options.ResponseType = OpenIdConnectResponseType.Code;
options.ProtocolValidator.RequireState = true;
options.UsePkce = false;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
}
一旦用户通过身份验证,当我获得所有信息时,它工作得很好:code
, 。token
id_token
- 我将上面的代码复制到我的 API 中,并将 clientId/clientSecret 更改为指向我的资源服务器。
- 从我的 web 应用程序中,我调用 API 添加 Authorization : Bearer
token
(之前收到)。
但是在 API 解决方案中,无论我在授权标头中传递什么,我每次都会被重定向到登录页面。
我是否需要更改我的 API 代码中的某些内容以使令牌“传输”到资源服务器并验证收到的令牌?
干杯,
解决方案
API 的行为与 Web 后端不同。API 不应重定向客户端,而应仅验证 JWT 访问令牌:
- JWT 有效时返回 200 错误
- 不是时返回 401 错误
您可以在 API 中使用不同的 .Net 中间件,方法是调用AddJwtBearer
. 这是执行此操作的Curity 代码示例。
主要是实现基于标准的行为,然后可以使用任何编程语言和授权服务器。
API 代码
API JWT 验证有两种主要方法,您使用的是第一种:
- 使用 JWT 框架(例如 ASP.Net Core)
- 使用 JWT 库
当您不熟悉使用 OAuth 保护 API 时,了解库方法的代码是什么样子会很有用,就像在我的这个类中一样,它显示了 API 应该使用的步骤:
- 从授权服务器下载令牌签名公钥
- 将公钥提供给一个库,然后该库将以加密方式验证 JWT
- 还要检查发行者、受众和算法是否符合预期
.Net Core 会自动为您执行此操作,因此请使用 Curity 代码示例方法,因为您将编写更少的代码。
推荐阅读
- java - Jmeter 2.11:让对等体未经过身份验证
- javascript - 如何使用样式组件将道具传递给 .mapped 元素?
- javascript - 如何使用 influxdb 和 Grafana 通过 docker 运行 K6
- sql - 将数据库排序规则读入 SQL Server 中的变量时出现问题
- vb.net - List 和 CheckedListBox 中的项目顺序问题
- java - Java 串行通信 -> EventListener 的问题
- r - dplyr transmute 的存在函数无法按预期工作
- perl - 在 Perl 中解析时从文件数据中获取最新记录(详细信息)
- regex - 使用正则表达式获取以 1 或 2 位数字、点和空格开头的多个匹配项
- ssl - 如何引用名称中带有哈希后缀的证书管理器生成的机密?