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

时间:2018-01-28 17:29:06

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

我使用的是Identity Server 4,Asp Identity,EF Core和一个数据库。 我目前有3个项目

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

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

1 个答案:

答案 0 :(得分:2)

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

首先,IdentityServer不适合您的应用表格。这些是单独的背景和单独的迁移。首选方法是保持关注点的分离。

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

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

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

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

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

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

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

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