Identity Server 4,EF Core,在 API 和 IS4 之间共享 DbContext

Identity Server 4, EF Core, share DbContext between API and IS4

我正在使用 Identity Server 4、Asp Identity、EF Core 和一个数据库。 我目前有 3 个项目

问题: 如何从 IdentityServer 项目访问数据上下文并且仍然将所有设置(数据库连接等)放在一个地方。我知道我可以从 API 引用 IdentityServer 并使用数据上下文,但这对我来说似乎不合适。执行此操作的首选方法是什么?

由于您对此选项感兴趣,我决定将我的评论移至此答案。

首先,IdentityServer 不是您的应用 table 的地方。这些是单独的上下文和单独的迁移。首选方法是保持关注点分离。

正如我在回答 中解释的那样,您不需要登录用户与您的业务上下文之间存在关系。而是在业务上下文中创建一个用户。登录用户与企业用户的目的不同。

我没有适合你的代码,但你可以从 IdentityServer 中获取示例应用程序之一。调整 API 以使用您的业务环境。在该上下文中添加用户 table(link 到 sub 声明)和业务上下文所需的字段。顺便说一句,table 是否在同一个数据库中并不重要,只是不要混合上下文。

IdentityServer 中:如果用户可以注册一个网站,那么您可以使用可用网站的下拉列表扩展 注册表单。或者一个列表,如果用户可以注册多个网站。

现在取决于选择的策略。您可以等待在 API 中注册用户,但我认为立即注册用户要容易得多。还有其他选项,但这是 IdentityServer 配置的一部分(不向 IdentityServer 添加业务逻辑):

扩展IdentityServer以在注册用户后调用API。为此,我会在 IdentityServer 上下文中添加一个 table,其中包含要为每个网站注册的 URL。创建登录用户时,调用配置的API(s)注册业务用户

在 API 中,您需要添加 IdentityServer 可以调用以创建用户的方法,linked 到 sub 声明并包括所需的用户信息。通过这种方式,您可以使用 sub 声明来识别登录用户,并 link 将其发送给企业用户。

您可以对客户端应用程序使用类似的策略。使用 API 方法扩展 IdentityServer 以允许客户端应用程序注册用户。

如果您想撤回访问权限,您可以删除登录用户,而不必删除企业用户。如果你不想破坏历史信息,你就不会想要它。您还可以使用声明来指定用户是否可以访问该网站,而无需删除登录用户。