一旦 SCIM 与我的服务提供商集成,我该如何创建新资源?

问题描述

我是 SCIM 新手。

在 SCIM 工作流程中,我只是好奇如何在服务提供商端创建新用户。 如果我在服务提供商端的本地用户表中创建新用户,然后发送 SCIM 发布用户请求。此请求可能由于多种原因而失败,例如:网络断开、服务关闭、数据验证失败等。

所以我打算在服务提供商端使用SCIM api来创建新用户。工作流程将如下所示Desgin#1

Desgin#2 我认为这是不正确的,因为我可以发现在这种设计中会出现一些问题,例如竞态条件。

我的想法正确吗?

  (1) Design#1: I intend to use this. All user operations are performed by IdP side.
                I can avoid some problem like race condition.
      ┌───────────────────┐              ┌───────────────────────┐
      │                   │              │                       │
      │   SCIM IdP Side   │              │ Service Provider Side │
      │                   │              │                       │
      │ (ex: Okta,Azure )│              │ (ex: my website)      │
      │                   │              │                       │
      │  [IdP]            │              │  [SP]                 │
      │                   │              │                       │
      └────────┬──────────┘              └────────────┬──────────┘
               │                                      │
               │                                      │
               │                                      │
               │◄─────────────────────────────────────┤
               │  (1) POST USER Through SCIM Protocol │
               │                                      │
               │                                      │
               │                                      │
               │                                      │
               │                                      │
               ├─────────────────────────────────────►│
               │  (2) IdP created successfully,│
               │      got by SP and the create        │
               │      user entry in SP's database     │
               │                                      │
               │      Also notify other SP by SCIM    │
               │      protocol(new user created)      │
               ▼                                      ▼



  (2) Design#2: I think this will cause race conditon,once we have lots of SP resouce creating

     ┌───────────────────┐              ┌───────────────────────┐
     │                   │              │                       │
     │   SCIM IdP Side   │              │ Service Provider Side │
     │                   │              │                       │
     │ (ex: Okta,Azure )│              │ (ex: my website)      │
     │                   │              │                       │
     │  [IDP]            │              │  [SP]                 │
     │                   │              │                       │
     └────────┬──────────┘              └────────────┬──────────┘
              │                                      │
              │                                      ├────────┐
              │                                      │        │ (1) SP create new user in
              │                                      │        │     local Database
              │                                      │        │
              │                                      │        │
              │                                      │        │
              │                                      │        │
              │◄─────────────────────────────────────┤◄───────┘
              │  (2) After user is created locally,│
              │      POST USER Through SCIM Protocol │
              │      to remote IdP Side.             │
              │                                      │
              │                                      │
              ├─────────────────────────────────────►│
              │  (3) Also notify other SP by SCIM    │
              │      protocol(new user created)      │
              ▼                                      ▼

解决方法

您似乎熟悉 SAML 术语,并且将其与 SCIM 混为一谈。公平地说,它们与一些共同的措辞有关,但如果没有阅读 RFC 100% 准确,可以用其他可能有助于理顺它的词来解释。

我认为简单的 1:1 SCIM 关系是 Directory ServiceDownstream Application。正如我所说,这些不是 RFC 的一部分,但有助于理解。

Directory Service 负责保存用户的身份和个人信息。由于这些信息的性质,他们通常也是身份提供者(Okta、AAD),但不一定。

当设置 Directory ServiceDownstream Application(使用 SCIM)之间的集成时,用户信息的正常流动是一种方式

这很重要。

事物管理 Directory Service 中的用户。这可以是任何 CRUD 操作,一旦在它自己的数据库(用户真实情况的来源)中完成,将进行基于网络的 SCIM 调用来配置、编辑或删除 downstream application .

SCIM 协议没有定义需要发出的特定请求。例如,要在下游应用程序中创建新用户,身份服务必须首先检查该用户是否已存在并采取适当的行动。像这样的事情将是一个明智的实施:

  1. 从应用程序请求用户 xyz@domain.com
  2. 如果用户不存在,请请求创建它们。
  3. 如果用户存在,检查返回的信息与本地保存的信息是否有差异;如果存在差异,请更新应用程序中的用户。

根据您的应用程序,您可能根本不允许任何用户管理,并且用户只是由 SCIM 协议专门管理。这完全没问题。 但是,如果您这样做,它会变得更加复杂;

  1. 您的应用中已有用户,并且
  2. 允许编辑应用程序中的信息

如果出现上述任何一种情况,则您必须特别努力阻止用户或管理员更改 SCIM 负责的字段。应用程序不会自动触发通知目录服务发生了更改。

虽然像 Okta 这样的服务允许从下游应用程序批量导入回自身,但这是一个选择的实现,并不是 SCIM 在这种情况下的真正意图。

总而言之:Directory Services 是您的用户信息的权威来源。您将从该服务获取用户数据,并且不会通过 SCIM 向其提供数据,或者成为从您的应用程序创建用户的触发器。

希望能稍微解释一下。