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 实战之角色授权详解

ASP.NET Identity(使用 IdentityServer4)获取外部资源 oauth 访问令牌

我可以使用 IdentityServer4 spa JS UI 而不是 asp .net core mvc 吗?