【问题标题】:Identity Server 4, EF Core, share DbContext between API and IS4Identity Server 4,EF Core,在 API 和 IS4 之间共享 DbContext
【发布时间】:2018-01-28 17:29:05
【问题描述】:

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

  • IdentityServer - 包含我的应用表的所有数据上下文和所有迁移
  • Api - 没有上下文,没有迁移,但是我需要从这里以某种方式访问​​数据库
  • Clinet - javascript

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

【问题讨论】:

  • IdentityServer 不是您的应用表的位置。这些是单独的上下文和单独的迁移。首选方法是保持关注点的分离。
  • @RuardvanElburg 我还需要 ASP 身份表,并从我的应用程序与 ASP 身份的用户表建立关系。而身份服务器也需要 Asp Identity 表
  • 谢谢。但是如果我有两个数据库 AppUser 需要知道它属于 IdentityUser。所以当用户使用 IdentityServer 注册时,IdentityServer 需要将新的 AppUser 插入到另一个数据库表中。
  • 这个不用改,一旦用户登录并且不存在,你可以在你的应用数据库中注册用户。调用 Ids4 的 UserInfo 端点来请求有关用户的信息。
  • @RuardvanElburg 谢谢。它可能有效,但似乎有点复杂。难道你没有一个一起工作的例子(与 IS 用户和应用程序用户)?

标签: database asp.net-core asp.net-identity identityserver4 ef-core-2.0


【解决方案1】:

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

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

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

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

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

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

注册用户后扩展IdentityServer调用API。为此,我将在IdentityServer 上下文中添加一个表格,其中包含用于注册每个网站的 URL。创建登录用户后,调用配置的 API 来注册业务用户。

在 API 中,您需要添加 IdentityServer 可以调用以创建用户的方法,链接到 sub 声明并包含所需的用户信息。这样您就可以使用 sub 声明来识别登录用户并将其链接到业务用户。

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

如果您想撤销访问权限,您可以删除登录用户,而无需删除业务用户。如果您不想破坏历史信息,您不想要的。您还可以使用声明来指定用户是否可以访问网站,而无需删除登录用户。

【讨论】:

  • 感谢您的回答。我打算这样试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
相关资源
最近更新 更多