目录

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();
    });
警告

禁用令牌存储会阻止启用引用访问或刷新令牌支持,因为这需要将令牌存储在数据库中。