Pæt*_*sen 8 architecture asp.net-identity entity-framework-core openid-connect identityserver4
这是我第一次使用 IdentityServer 4 和 AspNetIdentity 设置 OpenID Connect,我希望有人能够揭开有关存储用户数据的部分的神秘面纱。
到目前为止,我读到的是用户数据应该存储在连接到身份验证服务器的身份验证数据库中,但我真的很想将用户数据存储在连接到资源服务器的资源数据库中。
我目前有一个如下所示的数据模型:
我省略了 User 和 Event 的许多字段,但希望您能了解情况。我们有一个用户表、一个事件表和一个主机表。用户可以主持活动。用户和事件之间的多对多关系是通过主机表。
这是一个关于架构的基本问题,但真的很难找到一个有意义的好答案,这不是一个完全的黑客。到目前为止,我已经阅读了来自不同人的以下解决方案:
仅将所有用户数据存储在 Auth 数据库中,然后在 Auth 服务器上设置 API,以便资源服务器可以从 Auth 服务器获取数据。
其他人说不应该将用户的城市或国家等非身份验证相关数据存储在身份验证数据库中。取而代之的是,仅在 Auth 服务器中保留与 auth 相关的数据,而在 Resource DB 中保留任何与用户相关的数据。这听起来像两个用户记录需要同步?听起来是个坏主意。
让资源服务器和身份验证服务器成为一个应用程序,以便我们可以在用户、主机和事件之间建立必要的关系。但这似乎违背了使用 OpenID Connect 的全部目的。
那么这里的标准架构是什么?或者,如果没有万能的,您将如何存储这些用户数据?
考虑到关注点分离和单一责任:
不仅仅是一张用户表。表中的字段仅在上下文中有意义。
一个用户可以有一个谷歌账户来登录,但对于不能联系到员工的账户的企业。如何在报告中显示不属于上下文的信息?假设您将城市存储在身份上下文中。那么你将如何在报告中显示这些信息?您将需要业务上下文中的信息。
还要考虑身份上下文是否是存储信息的好地方。因为用户在掌控之中。当用户不同意使用信息或只是删除帐户时会发生什么?当您想要同步数据时使用什么策略?
共享上下文是不行的。身份是 IdentityServer 的职责,身份上下文应该只包含有关身份的信息,并且只能由 IdentityServer 访问。请注意,IdentityServer 不绑定到一个应用程序。
每个上下文中都需要一个用户表。信息可能看起来多余但实际上不是,因为它是单独上下文的一部分。就像您使用 Google 等提供商登录时一样。然后在身份上下文中创建用户的本地副本。
但也许您不应该在业务上下文中将其称为用户。因为在业务环境中没有用户。他们很可能是员工、客户等。他们可以登录,但不一定。并且可能有业务未知的(身份)用户(例如,在多个应用程序的情况下)。
IdentityServer 是对用户进行身份验证的权限。授权可以在多个级别上实施。您可以创建一个单独的授权服务器(如policyserver)。或更低级别(基于资源的),其中“人员”表中存在用户意味着该用户有权访问该资源。
单独上下文的最佳部分是在上下文中您可以在表之间创建关系,而不会干扰其他上下文。如果您愿意,您可以轻松切换到不同的 oidc 提供商。但是一旦你开始混合上下文,就没有退路了。
在 oidc 中非常有用的一件事是sub声明。只需通过sub声明查找用户并使用本地 ID 作为业务上下文。
关于字段city和country身份上下文:有多个级别的身份验证,因此您实际上可能需要此上下文中的信息。但是如果您需要在另一个上下文中的信息(例如显示在报告中),那么它应该被添加到那里(以及)。
| 归档时间: |
|
| 查看次数: |
1354 次 |
| 最近记录: |