将外部身份用户与现有用户相关联

Linking External Identity Users With Existing Users

我正在添加一个外部身份提供商 Azure 多租户作为登录选项。我现在有本地帐户,他们对 Azure AD 用户一无所知。

我想创建一个 Azure Enterprise 应用程序,其他租户可以使用它来使用 OpenID Connect 设置 SSO。我还希望该应用通过设置 SCIM API.

来支持用户配置

我真的找不到任何关于如何使用我的 IDP 中的现有帐户处理 linking Azure AD 用户的文档。我见过这样的例子,用户可以使用他们的本地帐户登录,使用 Azure 进行身份验证,然后他们的本地帐户被更新为拥有 Azure AD 用户 ID。这种方法看起来仍然很手动。另一个想法是在登录过程中加入一个步骤,如果没有本地帐户具有 Azure AD 用户 ID,则查找具有相同电子邮件的本地帐户。我也不喜欢这种方法,因为电子邮件可能并不总是匹配。是否有管理员可以自动 link 所有帐户同步或上传的方法?

系统

首先要明确角色:

Role Details
Authorization Server (AS) Your UIs and APIs receive tokens from this. It is where accounts and linked accounts are stored. It is where you use SCIM to update account records. It is where you apply account linking logic.
Identity Provider (IDP) There can be multiple of these. When your apps call the AS it manages connections to them, and exchanges IDP tokens for AS tokens that are returned to apps. It is not usual to use SCIM against an IDP.

您正在使用 IdentityServer 作为 AS,因此您的 UI 和 APIs 将继续使用 IdentityServer 令牌并保持简单。同时,Azure AD 将成为替代 IDP。因此,在数据方面,您的架构处于一个很好的位置。

身份验证操作

我的目标是通过 custom authentication actions 解决您的问题,并以与供应商无关的方式设计它。并非所有提供商都支持这些概念,但 IdentityServer 具有一些非常好的可扩展性功能,因此希望它能满足您的需求。

IdentityServer 中的一些代码、配置和技术调查感觉是正确的方向,不会给您的应用程序增加复杂性。我将根据 Curity(我工作的地方)描述技术,但相同的原则可以适用于任何系统。

用户名验证者

处理用户特定差异的一个好方法是让初始屏幕提示仅针对电子邮件。请参阅 this example 了解它的外观。稍后,当身份验证完成后,您可以设置一个 cookie,以便在后续登录时不会显示此屏幕。

然后,在请求凭据之前,应用一些脚本逻辑,例如查找现有帐户属性,并决定用户应如何进行身份验证。您可能决定将未知用户路由到 Azure AD 或根据业务合作伙伴电子邮件后缀执行某些操作。

数据更新

在添加 Azure AD 支持之前可能会起作用的简单方法是为所有用户分配一个租户 ID,并且可能现有用户的租户 ID 为 1。只有这些用户才能使用 Identity Server 登录 - 所有其他人必须使用 Azure AD。

脚本逻辑和帐户链接

有关其外观的有效示例,请参阅此 Account Linking with Facebook tutorial. In this example the objective is to update the main account with a new linked account. This account linking doc 可能会为您的场景提供一些额外的想法。应该可以在触发身份验证之前或在您拥有 Azure IDP 属性后 运行 自定义逻辑。

如有需要请让用户参与

当用户首次通过 Azure AD 登录时,显示自定义屏幕询问用户是否已有帐户也很有用。如果不是,则 Azure AD 登录除了链接帐户之外还可以在 IdentityServer 数据中创建主帐户。

用户和合作伙伴

用户加入的方式很有趣,并在 this detailed article 中进行了讨论。我总是先了解所涉及的资产类型:

Type Description
Personal Assets You allow any user to sign up and they only have access to their own assets
Corporate Assets Users are provisioned by an administrator, eg a banker is granted access to financial data according to business rules

在您的情况下,感觉用户属于第二类,因此要使用户能够完全注册,您需要来自合作伙伴的数据,手动输入或让他们致电您的 API , 然后才能为用户分配正确的租户 ID。这最终可能会导致 TenantID=23,但没有什么可以阻止您最初允许用户加入并将他们放置在默认 TenantID=0 存储桶中。

最终这一切都归结为数据、声明和 API 授权。例如,APIs 可以 return 某些数据给 TenantID=0 用户,但只有 return 特权数据给租户 ID 已被管理员断言的用户。不确定我的这些想法是否符合您的情况,但希望它们能提供一两个有用的提示。

摘要

可靠的帐户链接很棘手,但它应该可以通过授权服务器的构建块使用上述技术解决。最终结果应该是确定的用户数据,没有重复的用户。