OpenIddict Token storage
为了跟踪其服务器服务生成的所有令牌,OpenIddict 3.0 在数据库中为每个生成的令牌创建一个令牌条目。令牌条目包含元数据,例如令牌的主题、颁发给它的应用程序的客户端标识符或其创建和到期日期。
默认情况下,令牌负载——使用 Azure Active Directory IdentityModel Extensions for .NET 库为 JWT 令牌或 ASP.NET Core Data Protection为数据保护令牌生成——永远不会存储在数据库中,除了授权代码(很短-lived)、设备和用户代码(专门用于设备代码流)。
此类令牌(称为参考令牌)不会按原样返回给调用者:相反,它们的有效负载存储在数据库条目中,并且加密安全的随机 256 位标识符(称为参考标识符)作为 base64url 编码的字符串返回并作为客户端应用程序在与 OpenIddict 的端点或资源服务器通信时使用的“最终”令牌(如果在服务器选项中启用了引用访问令牌)。
笔记
在 OpenIddict 3.0 中,撤销令牌的能力与令牌格式无关,也不需要启用引用令牌:只要令牌存储未在服务器选项。
启用引用访问和/或刷新令牌
对于喜欢返回较短访问和/或刷新令牌或需要处理阻止通过网络发送大令牌的限制的开发人员,可以在服务器选项中手动启用参考访问和刷新令牌。
警告
启用引用访问和/或刷新令牌支持时,强烈建议:
- 将 ASP.NET Core 数据保护格式用于访问和刷新令牌,因为它们受益于额外的安全措施,如果它们从数据库中被盗,这些措施将阻止它们按原样发送。有关如何启用 ASP.NET Core 数据保护的更多信息,请阅读令牌格式。
- 启用列加密/静态数据加密以保护
Payload
令牌条目列。
services.AddOpenIddict()
.AddServer(options =>
{
options.UseReferenceAccessTokens()
.UseReferenceRefreshTokens();
});
在 API 级别启用令牌条目验证
出于性能原因,默认情况下,OpenIddict 3.0 在接收 API 请求时不检查令牌条目的状态:访问令牌在过期之前被视为有效。对于需要立即撤销访问令牌的场景,可以将 OpenIddict 验证处理程序配置为对每个 API 请求强制执行令牌条目验证:
笔记
启用令牌条目验证需要 OpenIddict 验证处理程序可以直接访问存储令牌的服务器数据库,这使其更适合与授权服务器位于同一应用程序中的 API。对于外部应用程序,请考虑使用内省而不是本地验证。
在这两种情况下,额外的延迟——由额外的数据库请求和用于自省的 HTTP 调用——是预期的。
services.AddOpenIddict()
.AddValidation(options =>
{
options.EnableTokenEntryValidation();
});
禁用令牌存储
虽然强烈反对,但可以在服务器选项中禁用令牌存储:
services.AddOpenIddict()
.AddServer(options =>
{
options.DisableTokenStorage();
});
警告
禁用令牌存储会阻止启用引用访问或刷新令牌支持,因为这需要将令牌存储在数据库中。