OpenIddict
什么是 OpenIddict?
OpenIddict 旨在提供一种通用的解决方案,以在任何 ASP.NET Core 2.1(及更高版本)应用程序中实现OpenID Connect 客户端、服务器和令牌验证支持。 由于本机 Microsoft.Owin 4.2 集成,ASP.NET 4.6.1(及更高版本)应用程序也得到了完全支持。
OpenIddict 完全支持代码/隐式/混合流、客户端凭据/资源所有者密码授予和设备授权流。
OpenIddict 本机支持Entity Framework Core、 Entity Framework 6和MongoDB 开箱即用,可以实现自定义存储以支持其他提供商。
入门
强烈建议寻求简单和交钥匙解决方案的开发人员使用OrchardCore 及其基于 OpenIddict 的 OpenID 模块,具有合理的默认值并提供内置管理 GUI 以轻松注册 OpenID 客户端应用程序。
要使用 OpenIddict 实现自定义 OpenID Connect 服务器,请阅读入门。
可以在专用存储库 中找到演示如何将 OpenIddict 与不同的 OAuth 2.0/OpenID Connect 流程结合使用的示例。
兼容性矩阵
网络框架版本 | .NET 运行时版本 | OpenIddict 3.x | OpenIddict 4.x(预览版) |
---|---|---|---|
ASP.NET 核心 2.1 | .NET 框架 4.6.1 | ✔️ℹ️ _ | ✔️ℹ️ _ |
ASP.NET 核心 2.1 | .NET 框架 4.7.2 | ✔️ | ✔️ |
ASP.NET 核心 2.1 | .NET 框架 4.8 | ✔️ | ✔️ |
ASP.NET 核心 2.1 | .NET 核心 2.1 | ✔️ | ❗ |
ASP.NET 核心 3.1 | .NET 核心 3.1 | ✔️ | ✔️ |
ASP.NET 核心 5.0 | .NET 5.0 | ✔️ | ❗ |
ASP.NET 核心 6.0 | .NET 6.0 | ✔️ | ✔️ |
ASP.NET 核心 7.0 | .NET 7.0 | ⚠️ℹ️ _ | ⚠️ℹ️ _ |
微软.Owin 4.2 | .NET 框架 4.6.1 | ✔️ℹ️ _ | ✔️ℹ️ _ |
微软.Owin 4.2 | .NET 框架 4.7.2 | ✔️ | ✔️ |
微软.Owin 4.2 | .NET 框架 4.8 | ✔️ | ✔️ |
❗ 注意:Microsoft 不再支持 .NET Core 2.1 上的 ASP.NET Core 2.1 和 .NET 5.0 上的 ASP.NET Core 5.0。由于 .NET Standard 2.0 的兼容性,OpenIddict 4.x 仍然可以在 .NET Core 2.1 上使用,但强烈建议用户迁移到 ASP.NET Core/.NET 6.0。.NET Framework 4.6.1(及更高版本)上的 ASP.NET Core 2.1 仍然得到完全支持。
❗注意:OpenIddict 受到 ASP.NET Core 7.0 中引入的重大更改的影响,AppContext
如果应用程序仅单独使用 OpenIddict
服务器功能而没有注册任何其他身份验证处理程序,则可能需要使用兼容性开关。有关详细信息,请阅读ASP.NET Core 7.0 的默认身份验证处理程序回退中断 OpenIddict。
ℹ️ 注意:以下功能在面向 .NET Framework 4.6.1 时不可用:
-
X.509
开发加密/签名证书:如果找不到有效的开发证书并且必须生成新证书,则调用
AddDevelopmentEncryptionCertificate()
orAddDevelopmentSigningCertificate()
将导致在运行时抛出错误。PlatformNotSupportedException
-
X.509 ECDSA 签名证书/密钥:调用
AddSigningCertificate()
或AddSigningKey()
使用 ECDSA 证书/密钥将始终导致PlatformNotSupportedException
在运行时抛出。
认证
与许多其他身份提供者不同,OpenIddict 不是一个交钥匙解决方案,而是一个需要编写自定义代码 才能运行的框架(通常,至少是一个授权控制器),这使得它不太适合认证程序。
虽然可以按原样提交参考实现,但这并不能保证 OpenIddict 用户部署的实现符合标准。
相反,鼓励开发人员在实现自己的逻辑后针对自己的部署执行一致性测试。
示例存储库包含专门设计用于 OpenID Connect 提供商认证工具的专用示例,并展示了 OpenIddict 可以轻松地用于经过认证的实施。为了尽可能快地执行认证测试,该示例不包含任何成员资格或同意功能(建议使用两个硬编码身份进行需要在身份之间切换的测试)。