将用户数据存储在身份验证服务器或资源服务器中?还是两者皆有?

时间:2019-05-05 12:26:56

标签: architecture entity-framework-core asp.net-identity identityserver4 openid-connect

这是我第一次使用IdentityServer 4和AspNetIdentity设置OpenID Connect,我希望有人能够揭开有关存储用户数据的神秘面纱。

到目前为止,我已经读到用户数据应该存储在连接到auth服务器的Auth数据库中,但是我真的很想将用户数据存储在连接到资源的数据库中服务器。

我目前有一个数据模型,如下所示:

enter image description here

我已经省略了User和Event的许多字段,但是希望您能看到图片。 我们有一个用户表,一个事件表和一个主机表。用户可以主持事件。用户和事件之间的多对多关系是通过主机表实现的。

这是关于体系结构的基本问题,但是,很难找到一个有意义的好答案,但这并不是一个完全的hack。到目前为止,我已经从不同的人那里了解了以下解决方案:

  1. 仅将所有用户数据存储在Auth数据库中,然后在Auth服务器上设置API,以便资源服务器可以从Auth服务器获取数据。

  2. 有人说不应该将与身份验证无关的数据(例如用户所在的城市或国家/地区)存储在Auth数据库中。取而代之的是,仅将与身份验证相关的数据保留在Auth服务器中,并将与用户相关的所有数据保留在资源数据库中。听起来这两个用户记录需要同步吗?听起来是个坏主意。

  3. 将资源服务器和Auth服务器作为一个应用程序,以便我们可以在用户,主机和事件之间建立必要的关系。但这似乎违反了使用OpenID Connect的全部目的。

那么这里的标准架构是什么?或者,如果没有一种千篇一律的方法,您将如何存储此用户数据?

2 个答案:

答案 0 :(得分:0)

当我遇到类似问题时,我个人更喜欢使用的一个额外选项是在各种应用程序之间简单地共享身份数据库。这解决了不必要的重复的问题。但是,如果采用这种方式,则需要尝试确保保持某种关注点分离-身份管理不是由资源服务器应用程序完成,同样,与资源相关的数据管理也不由auth应用程序完成。

答案 1 :(得分:0)

牢记关注点和单一责任:

不仅有一个用户表。表中的字段在上下文中仅具有含义。

用户可以使用Google帐户登录,但对于不是可以与员工联系的帐户的企业。在不属于上下文的报告中显示信息又如何呢?假设您在标识上下文中存储城市。然后,您将如何在报告中显示该信息?您需要在业务环境中提供信息。

还要考虑身份上下文是否是存储信息的好地方。因为用户在控制之中。如果用户不同意使用信息或只是删除帐户,该怎么办?想要同步数据时使用什么策略?

共享上下文是行不通的。身份是IdentityServer的责任,身份上下文应仅包含有关身份的信息,并且只能由IdentityServer访问。请注意,IdentityServer未绑定到一个应用程序。

在每个上下文中都需要一个用户表。那里的信息似乎是多余的,但实际上不是多余的,因为它是单独上下文的一部分。就像您使用Google之类的提供商登录时一样。然后,在身份上下文中创建用户的本地副本。

但是,也许您不应该在业务环境中将其称为“用户”。因为在业务环境中没有用户。他们很可能是员工,客户等。谁可以登录,但不一定。并且可能有(身份)用户不熟悉该业务(例如,在有多个应用程序的情况下)。

IdentityServer是对用户进行身份验证的权限。授权可以在多个级别上实现。您可以创建单独的授权服务器(例如policyserver)。或较低级别(resource-based),其中“人员”表中存在用户意味着该用户有权访问资源。

单独上下文的最好之处在于,可以在上下文内创建表之间的关系,而不会干扰其他上下文。您可以根据需要轻松切换到其他oidc提供程序。但是一旦开始混合上下文,就没有回头路了。

在oidc中非常有用的一件事是sub声明。只需通过sub声明查找用户,并将本地ID用于业务环境即可。

关于身份上下文中的字段citycountry:身份验证有多个级别,因此您实际上可能需要此上下文中的信息。但是,如果您需要在其他上下文中使用该信息(例如在报告中显示),则也应该在其中添加该信息。