问题描述
我是 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 Service
和 Downstream Application
。正如我所说,这些不是 RFC 的一部分,但有助于理解。
Directory Service
负责保存用户的身份和个人信息。由于这些信息的性质,他们通常也是身份提供者(Okta、AAD),但不一定。
当设置 Directory Service
和 Downstream Application
(使用 SCIM)之间的集成时,用户信息的正常流动是一种方式。
这很重要。
事物管理 Directory Service
中的用户。这可以是任何 CRUD 操作,一旦在它自己的数据库(用户真实情况的来源)中完成,将进行基于网络的 SCIM 调用来配置、编辑或删除 downstream application
.
SCIM 协议没有定义需要发出的特定请求。例如,要在下游应用程序中创建新用户,身份服务必须首先检查该用户是否已存在并采取适当的行动。像这样的事情将是一个明智的实施:
- 从应用程序请求用户 xyz@domain.com
- 如果用户不存在,请请求创建它们。
- 如果用户存在,检查返回的信息与本地保存的信息是否有差异;如果存在差异,请更新应用程序中的用户。
根据您的应用程序,您可能根本不允许任何用户管理,并且用户只是由 SCIM 协议专门管理。这完全没问题。 但是,如果您这样做,它会变得更加复杂;
- 您的应用中已有用户,并且
- 允许编辑应用程序中的信息
如果出现上述任何一种情况,则您必须特别努力阻止用户或管理员更改 SCIM 负责的字段。应用程序不会自动触发通知目录服务发生了更改。
虽然像 Okta 这样的服务允许从下游应用程序批量导入回自身,但这是一个选择的实现,并不是 SCIM 在这种情况下的真正意图。
总而言之:Directory Services
是您的用户信息的权威来源。您将从该服务获取用户数据,并且不会通过 SCIM 向其提供数据,或者成为从您的应用程序创建用户的触发器。
希望能稍微解释一下。