项目
版本

OpenIddict 令牌存储

为了跟踪服务器服务生成的所有令牌,OpenIddict 3.0 为每个生成的令牌在数据库中创建一个令牌条目。令牌条目包含元数据,如令牌的主题、颁发给它的应用程序的客户端标识符及其创建和过期日期。

默认情况下,令牌负载——使用 Azure Active Directory IdentityModel Extensions for .NET 库 为 JWT 令牌生成或使用 ASP.NET Core 数据保护 为数据保护令牌生成——永远不会存储在数据库中,除非是授权码(短期存在)、设备码和用户码(仅在设备码流程中使用)。

这些被称为引用令牌的令牌不会原样返回给调用者:相反,它们的负载被存储在数据库条目中,而一个加密安全的随机 256 位标识符——称为引用标识符——被作为 base64url 编码的字符串返回,并充当客户端应用程序在与 OpenIddict 端点或资源服务器通信(如果在服务器选项中启用了引用访问令牌)时使用的“最终”令牌。

在 OpenIddict 3.0 中,撤销令牌的能力并不依赖于令牌格式,也不需要启用引用令牌:只要在服务器选项中没有明确禁用令牌存储,常规的 JWT 或 ASP.NET Core 数据保护令牌都可以被撤销。

启用引用访问和/或刷新令牌

对于偏好返回较短的访问和/或刷新令牌或需要处理限制以防止通过网络发送大型令牌的开发者,可以在服务器选项中手动启用引用访问和刷新令牌支持。

当启用引用访问和/或刷新令牌支持时,强烈建议:
  • 对访问和刷新令牌使用 ASP.NET Core 数据保护格式,因为它们受益于额外的安全措施,即使从数据库中被盗也不会直接发送出去。有关如何启用 ASP.NET Core 数据保护的更多信息,请阅读令牌格式。
  • 启用列加密/静态数据加密来保护令牌条目中的 Payload 列。
services.AddOpenIddict()
    .AddServer(options =>
    {
        options.UseReferenceAccessTokens()
               .UseReferenceRefreshTokens();
    });

在 API 级别启用令牌条目验证

出于性能考虑,默认情况下,OpenIddict 3.0 在接收到 API 请求时不检查令牌条目的状态:访问令牌在其过期前被视为有效。对于需要立即撤销访问令牌的场景,可以配置 OpenIddict 验证处理器为每个 API 请求强制执行令牌条目验证:

启用令牌条目验证要求 OpenIddict 验证处理器能直接访问存储令牌的服务器数据库,这使得它更适合与授权服务器位于同一应用程序中的 API。对于外部应用程序,请考虑使用 introspection 而非本地验证。 在这两种情况下,由于额外的数据库请求和 introspection 的 HTTP 调用,预计会有更多的延迟。

services.AddOpenIddict()
    .AddValidation(options =>
    {
        options.EnableTokenEntryValidation();
    });

禁用令牌存储

虽然强烈不推荐,但在服务器选项中可以禁用令牌存储:

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.DisableTokenStorage();
    });
禁用令牌存储会阻止启用引用访问或刷新令牌支持,因为这需要在数据库中存储令牌。
在本文档中