【问题标题】:Should my identity server own the user profiles?我的身份服务器是否应该拥有用户配置文件?
【发布时间】:2019-12-22 14:43:12
【问题描述】:

现在我有一个移动应用程序 (M)、一个 Web api (A) 和一个 Identity 4 服务器 (I)。

我的目标是采用微服务 DDD 方法。

我的身份服务器是否应该在其自己的数据库中拥有用户配置文件(用于注册/登录),或者我的 API 是否应该在其数据库中拥有这些用户配置文件?

场景 1 是 Identity 拥有它们,场景 2 是 API 拥有它们。

在我看来场景 1 是有道理的,但我对这个问题的假设如下:

场景 1,注册:

我有一个往返身份的旅程。

M -> I -> M

场景 1,登录:

我有一个往返身份的旅程。

M -> I -> M

场景 2,注册:

我有这样的旅行

M -> A -> M

场景 2,登录:

移动应用与 Identity 对话,后者要求 API 检查用户,并在成功时将令牌发送回移动应用。

M -> I -> A -> I -> M

或者移动应用程序与 API 对话,成功后从 Identity 获取令牌,然后将它们发送回移动应用程序。

M -> A -> I -> A -> M

【问题讨论】:

  • 通常,您不会将带有用户信息(姓名、电子邮件等)的配置文件复制到 API 的数据库中。而且你的流程更像M tries to access protected resource -> A returns 401 since user not authorized -> M redirects to identity provider -> I user logs in / signs up and idp issues token -> M uses token to access protected resource -> A returns protected resource -> M receives protected resource

标签: architecture domain-driven-design microservices identityserver4


【解决方案1】:

我倾向于让我的 身份和访问控制 BC 拥有用户和相关权限,并且有 API(其余、程序集)可以显示相关功能,我遵循您的模式的这个版本:

M -> A -> I -> A -> M

如果我有一个网站 (S),那么它将是:

S -> A -> I -> A -> S

当我执行登录时,会创建一个新会话,并针对该会话注册用户的权限,因为获取它们可能是一项昂贵的工作。

然后针对此缓存 版本的权限执行所有授权。如果权限发生变化,那么用户仍将获得现有会话权限的授权。如果这是不受欢迎的行为,则在更改权限后会话可能会过期。

【讨论】:

    【解决方案2】:

    用户将存在于这两个地方,主要身份在身份服务器中,而任何相关的应用程序范围声明都存在于 api 中。

    您可以在颁发令牌中设置粗略的声明,但这会导致声明在颁发令牌期间有效,或者更糟糕的是,在每次调用时检查身份服务器以获取已撤销的令牌。

    至少使用 ASP .net,您通常会做的是使用声明转换,它可用于获取提供的用户 ID(或声明)并添加到它们 - 也称为声明丰富。

    这样,对用户访问权限所做的任何更改都将在每次调用时运行的转换过程中被提取。

    由于该过程在本地发生,因此不需要外部系统,并且速度很快,并且(应该)与任何其他系统松散耦合,仅针对对本地应用有意义的安全角色进行了丰富的声明。

    请原谅 C# 示例不确定您正在运行什么代码(可能是 .net 给定 Identity Server?)无论哪种方式,这篇文章都提供了在本地应用程序 Add claims with Owin Middleware 中转换声明的一般过程。

    【讨论】:

      猜你喜欢
      • 2018-03-09
      • 2020-06-04
      • 2017-08-25
      • 2020-10-21
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2017-01-11
      • 2020-01-13
      相关资源
      最近更新 更多