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 中不允许多个声明提供者使用相同的签名密钥信任。
执行此操作的方法是以下之一
- 使用 Azure AD B2B 邀请来自一个或多个 Azure AD 租户的访客加入您的 Azure AD 租户,然后将 ADFS 作为一个 CP 信任连接到您的租户。
- 对于 ADFS 2016,我们还要求将每个 Azure AD 租户视为具有不同 policy/rules 声明 acceptance/augmentation 的不同 CP 信任。为此,我们现在允许将每个 Azure AD 租户建模为唯一的 CP 信任。
希望这能回答您的问题。
谢谢
//山姆 (@MrADFS)
一些背景:
我的公司(作为 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 中不允许多个声明提供者使用相同的签名密钥信任。
执行此操作的方法是以下之一
- 使用 Azure AD B2B 邀请来自一个或多个 Azure AD 租户的访客加入您的 Azure AD 租户,然后将 ADFS 作为一个 CP 信任连接到您的租户。
- 对于 ADFS 2016,我们还要求将每个 Azure AD 租户视为具有不同 policy/rules 声明 acceptance/augmentation 的不同 CP 信任。为此,我们现在允许将每个 Azure AD 租户建模为唯一的 CP 信任。
希望这能回答您的问题。
谢谢 //山姆 (@MrADFS)