项目
版本

OpenIddict 令牌格式

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

有关引用令牌的更多信息,请阅读 令牌存储

JSON Web Token (JWT)

OpenIddict 3.0 实现了 JSON Web Token (JWT)JSON Web Signature (JWS)JSON Web Encryption (JWE) 标准,并依赖由微软开发和维护的 Azure Active Directory IdentityModel Extensions for .NET 库,使用在服务器选项中注册的凭据生成签名和加密的令牌。

JWT 令牌类型

为了防止令牌替换和混淆代理攻击,OpenIddict 3.0 使用标准的 typ JWT 头来传达实际的令牌类型。此机制替代了之前版本的 OpenIddict 中用于相同目的的私有 token_usage 声明。

根据 OAuth 2.0 访问令牌的 JSON Web Token (JWT) 规范OpenIddict 3.0 产生的访问令牌总是带有 "typ": "at+jwt" 的头,而身份令牌仍使用 "typ": "JWT" 以保持向后兼容性。其他类型的令牌——仅被 OpenIddict 自身的端点接受——使用以 oi_ 开头的私有令牌类型。

禁用 JWT 访问令牌加密

默认情况下,OpenIddict 强制对所有支持的令牌类型进行加密。出于安全原因,不能为授权码、刷新令牌和设备代码禁用这一强制要求,但对于希望与第三方 API/资源服务器集成的情况,可以为访问令牌放松这一要求。如果接收访问令牌的资源服务器不完全支持 JSON Web Encryption,也可以禁用访问令牌的加密。

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.DisableAccessTokenEncryption();
    });

ASP.NET Core 数据保护

OpenIddict 3.0 也可以配置为使用 ASP.NET Core 数据保护 创建数据保护令牌,而不是 JWT 令牌。ASP.NET Core 数据保护使用自己的密钥环来加密令牌并防止篡改,适用于所有类型的令牌,除了身份令牌,身份令牌始终是 JWT 格式。

与 JWT 不同,ASP.NET Core 数据保护令牌仅支持对称加密,并依赖 ASP.NET 团队开发的二进制格式,而非像 JWT 这样的标准。虽然这阻止了在需要互操作性的场景中使用这类令牌,但选择 ASP.NET Core 数据保护而非 JWT 实际上有一些优势:

  • ASP.NET Core 数据保护令牌不使用 JSON 表示,因此通常略短一些。
  • ASP.NET Core 数据保护设计用于实现高吞吐量,因为它被 ASP.NET Core 本机用于身份验证 cookie、防伪令牌和会话 cookie。
尽管其名称包含“ASP.NET Core”,但 ASP.NET Core 数据保护并不绑定到 ASP.NET Core,可以在任何兼容 .NET Standard 2.0 的应用程序中使用,包括使用 Microsoft.Owin 的旧版 ASP.NET 4.6.1(及更高版本)应用程序。
要在 OpenIddict OWIN 服务器和验证主机中启用 ASP.NET Core 数据保护支持,您需要手动引用 OpenIddict.Server.DataProtectionOpenIddict.Validation.DataProtection 包。

切换到数据保护令牌

ASP.NET Core 数据保护支持由 OpenIddict.Server.DataProtectionOpenIddict.Validation.DataProtection 包提供。这些包被 OpenIddict.AspNetCore 元包引用,因此不必显式引用。

要启用 ASP.NET Core 数据保护支持,在服务器和验证选项中调用 options.UseDataProtection()

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.UseDataProtection();
    })

    .AddValidation(options =>
    {
        options.UseDataProtection();
    });

切换到 ASP.NET Core 数据保护令牌并不会阻止在启用数据保护支持之前发行的 JWT 令牌被验证:现有令牌仍然可以与新发行的 ASP.NET Core 数据保护令牌一起使用,直到它们过期。当使用 JWT 刷新令牌发送刷新令牌请求时,应用将收到一个 ASP.NET Core 数据保护刷新令牌,并自动将之前的标记为已兑换。

默认情况下,启用 ASP.NET Core 数据保护支持将自动将所有类型的令牌格式(除了定义上总是 JWT 的身份令牌)从 JWT 切换到数据保护。OpenIddict 数据保护集成可以配置为在创建新令牌时优先使用 JWT,这对于仅为特定类型的令牌(例如授权码和刷新令牌,而不是访问令牌)使用 ASP.NET Core 数据保护格式时特别有用

services.AddOpenIddict()
    .AddServer(options =>
    {
        options.UseDataProtection()
               .PreferDefaultAccessTokenFormat()
               .PreferDefaultAuthorizationCodeFormat()
               .PreferDefaultDeviceCodeFormat()
               .PreferDefaultRefreshTokenFormat()
               .PreferDefaultUserCodeFormat();
    });
当授权服务器和 API/资源服务器不是同一应用程序的一部分时,ASP.NET Core 数据保护必须配置为使用相同的应用程序名称并共享相同的密钥环,以便 OpenIddict 验证处理器能够读取由位于另一个项目中的授权服务器生成的 ASP.NET Core 数据保护令牌。
有关更多信息,请阅读 配置 ASP.NET Core 数据保护
在本文档中