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。
Microsoft.Owin
的旧版 ASP.NET 4.6.1(及更高版本)应用程序。要在 OpenIddict OWIN 服务器和验证主机中启用 ASP.NET Core 数据保护支持,您需要手动引用
OpenIddict.Server.DataProtection
和 OpenIddict.Validation.DataProtection
包。
切换到数据保护令牌
ASP.NET Core 数据保护支持由 OpenIddict.Server.DataProtection
和 OpenIddict.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();
});
有关更多信息,请阅读 配置 ASP.NET Core 数据保护。