Azure AD SSO 多租户应用程序/AD FS 声明提供商问题

Azure AD SSO Multi-Tenant App / AD FS Claims Provider Issue

一些背景:

我的公司(作为 SP)目前通过 AD FS 2.0 与我们的联合伙伴 (IdP) 一起处理 SSO。每个合作伙伴都被设置为声明提供者,并创建了用于转换将发送到我们的 Web 应用程序的传入声明的规则。

身份验证后,包含声明的令牌 posted 到我们的 STS 端点(例如 https://sts.companyname.ca/adfs/ls) where the claims are transformed and sent to our web application url (e.g. https://companyname.ca/externalsignin.aspx),并由帐户 lookup/creation.

之前的 OWIN 中间件处理

这一切都很完美。现在,我们的任务是将 Azure AD SSO 集成到组合中,以帮助简化入职流程。

我已经在 Azure 中创建了一个新目录并在其中创建了一个新应用程序。我已将应用程序标记为多租户并将回复 url 设置为“https://sts.companyname.ca/adfs/ls”。在我们服务器上的 AD FS 2.0 客户端中,我创建了一个名为 "AzureAD" 的新声明提供程序,并从 Azure 控制台上应用程序的端点部分导入了元数据url。使用我们租户的电子邮件测试登录效果非常好。问题在于使用来自另一个租户的组织电子邮件进行测试时,身份验证失败并显示错误的请求消息:

经过一些研究,这似乎是由于为 login.microsoftonline.com/tenantid 构建的登录表单,而 login.microsoftonline.com/common 应该用于多租户应用。所以我从 https://login.microsoftonline.com/common/federationmetadata/2007-06/federationmetadata.xml instead and updated.

重新导入了元数据

现在,当我使用另一个租户组织帐户登录时,我实际上可以看到同意请求,但在身份验证后,post 到 sts.companyname。ca/adfs/ls 失败,因为令牌是为 "sts.windows.net/0000-000000-000000-0000" 签名,但 AD FS 中的声明提供程序由 sts.windows.net/{tenantid} 占位符标识。

我不知道如何只使用一个带有模板化端点的 Azure 声明提供程序来完成这项工作(而且我只能添加 1 个 azure 声明提供程序,因为它们都使用相同的签名证书)。

如能帮助克服这一障碍,我们将不胜感激。

这将不起作用,因为 Azure AD 如何使用 ADFS 中的约束来发行令牌(相同的签名密钥但不同的租户颁发者)的阻抗不匹配,ADFS 中不允许多个声明提供者使用相同的签名密钥信任。

执行此操作的方法是以下之一

  1. 使用 Azure AD B2B 邀请来自一个或多个 Azure AD 租户的访客加入您的 Azure AD 租户,然后将 ADFS 作为一个 CP 信任连接到您的租户。
  2. 对于 ADFS 2016,我们还要求将每个 Azure AD 租户视为具有不同 policy/rules 声明 acceptance/augmentation 的不同 CP 信任。为此,我们现在允许将每个 Azure AD 租户建模为唯一的 CP 信任。

希望这能回答您的问题。

谢谢 //山姆 (@MrADFS)