IdentityServer4 与 ASP.NET 身份
Posted
技术标签:
【中文标题】IdentityServer4 与 ASP.NET 身份【英文标题】:IdentityServer4 with ASP.NET Identity 【发布时间】:2020-09-30 09:00:09 【问题描述】:我必须为 .NET Core 实现 OAuth,决定是 IdentityServer4。实际上,结果应该是一个身份验证端点,还带有登录 UI、重置密码 UI 等。但是,OAuth 必须适合现有的数据库结构。所以我不能简单地遵循最简单的“快速入门”手册。
我正在尝试理解 IdentityServer4 的概念,但我对 ASP.NET Core Identity 及其在其中的作用感到困惑。据我所知,ASP.NET Core Identity 提供了用户管理框架,包括登录、注册、密码重置等,包括数据库(使用 EntityFramework)。
我有一个必须使用的现有 SQL 数据库,没有机会进行任何更改。但是,结构类似于 ASP.NET Core Identity,所以我认为它可能会被使用(以某种方式)。我找到了如何实现“自定义用户”的文章
A/直接到IdentityServer4,文章here
或
B/ to ASP.NET Core Identity,文章here
这两种方法都是可行的,回到最初的问题 - 我想更深入地了解 IdentityServer4 并找出它对 ASP.NET Core Identity 的依赖程度。
非常感谢!
【问题讨论】:
【参考方案1】:IdentityServer4 有 2 个 DbContext,它们是框架的一部分,如果要将它们存储到数据库中,则必须使用它们。用于客户端和流配置的 ConfigurationDbConext。还有用于存储令牌等的 PersistentGrantDbContext。这 2 个 DbContext 是 IdentityServer4 的唯一核心部分。这些也可以存储在内存中,但我不建议这样做。这 2 个 dbcontext 可以与现有的数据库表一起存储,也可以根据需要存储在另一个数据库中。
用户管理等不是 IdentityServer 框架的一部分,您可以使用自己喜欢的实现,例如 ASP.NET Core 标识或自定义的东西。在您提到的文章中,魔术发生在 IProfileService
服务中,用户被检索到,IResourceOwnerPasswordValidator
被验证凭据。使用这些自定义实现从现有数据库中检索和验证用户。
此外,如果您查看快速入门示例项目,您会看到 UserStore 被注入到每个控制器中。如果需要,请随意将其替换为您自己的用户存储库。因此,为了回答您的问题,IdentityServer4 不依赖任何与用户/角色相关的存储框架,但您可以随意附加。
例如:在我的项目中,用户管理和身份验证是 2 个不同的微服务。在集群中,IdentityServer 在内部调用用户服务来获取请求的用户,但它甚至不是 Auth 微服务的一部分。 auth 服务只关注 OpenId 连接实现,但对用户基本上一无所知。
【讨论】:
托马斯,非常感谢!用户界面呢?基本上我需要有一个身份验证端点(您的两个微服务之一),它还提供用于登录的 UI,也许还提供用于密码重置的 UI。这个 UI 带有 ASP.NET Core Identity 包还是必须手动完成? 有一个快速入门模板可让您快速启动和运行。您可以将其用作参考,或立即在您的项目中实现它,以使您立即启动并运行。快速入门 UI 模板为每个场景提供 UI。通常,我使用这个并从那里修改它。在 QuickStart UI 模板中引用的 UserStore 和 TestUser 集当然应该替换为您自己的。如果您想将其与现有的控制器和视图一起使用,只需将其用作逻辑的参考即可。 deblokt.com/2019/09/01/01-identityserver4-quickstart 谢谢你!因此,据我了解,ASP.NET Identity 是 IdentityServer4 之上的额外层(嗯,这取决于观点)。如果我不想解决密码散列等问题,我可能想将 ASP.NET Identity 与自定义 IUserStore 提供程序一起使用,它为我解决了这个问题。如果我想 DIY 密码验证、散列等,我应该完全避免使用 ASP.NET Identity,直接使用 IdentityServer4 及其接口。登录 UI 是 Quickstart 的一部分,我可以使用它或完全自己创建它,它与 IdentityServer4 和/或 ASP.NET Identity 无关 嗯,它比这更微妙一些,但我认为如果您修改快速入门 UI 并尝试将其与您的 ASP.NET 身份用户表挂钩,您将了解Identity Server 4 包含的关注点分离。但底线是:用户管理、授权和登录 UI 在这件事上是 3 个独立的方面,其中 Identity Server 只处理授权部分。其他 2 个可以是您喜欢的实现,这 3 个的组合构成您正在寻找的解决方案。 有人成功使用 PostgreSQL 存储 ConfigurationDbConext 和 PersistentGrantDbContext 上下文吗?以上是关于IdentityServer4 与 ASP.NET 身份的主要内容,如果未能解决你的问题,请参考以下文章
Asp.net core IdentityServer4与传统基于角色的权限系统的集成
Asp.net core IdentityServer4与传统基于角色的权限系统的集成
ASP.NET Core分布式项目实战整理IdentityServer4 MVC授权Consent功能实现
Asp.Net Core 中IdentityServer4 实战之角色授权详解