将 SSO 管理到 Office 365 时的 SupportMultipleDomain 切换

备注

Office 365 ProPlus 正在重命名为适用于企业的 Microsoft 365 应用。 有关此更改的详细信息, 请阅读此博客文章

摘要

在使用 ADFS 将 SSO 管理到 Office 365 时使用 SupportMultipleDomain 开关

当通过 ADFS 为 O365 启用 SSO 时,您应该会看到为 O365 创建的信赖方 (RP) 信任。

AD FS 的屏幕截图,显示为 O365 创建的信赖方 (RP) 信任

将为 O365 创建 RP 信任的命令如下:

New-MsolFederatedDomain -DomainName<domain>
Update-MSOLFederatedDomain -DomainName <domain>
Convert-MsolDomainToFederated -DomainName <domain>

上面创建的 RP 信任有2个声明规则

MsolFederationProperty- 联合域上的域名显示对于源 ADFS 和 O365,"FederationServiceIdentifier" 是相同的,即http://stsname/adfs/Services/trust

在 ADFS汇总 1总成 2更新之前,Microsoft Office 365 客户使用单一登录 (SSO) 通过 AD FS 2.0,并将多个顶级域用于用户的用户主体名称 (UPN) 后缀在其组织中 (例如, @contoso.com 或 @fabrikam.com) 需要为每个后缀部署单独的 AD FS 2.0 联合身份验证服务实例。现已汇总了 AD FS 2.0 (https://support.microsoft.com/kb/2607496) ,与 "SupportMultipleDomain" 开关结合使用,使 AD fs 服务器能够在不需要其他 AD fs 2.0 服务器的情况下支持此方案。

在 ADFS 汇总1更新中,我们添加了以下功能:

多颁发者支持

以前,Microsoft Office 365 客户需要使用 AD FS 2.0 的单一登录 (SSO) ,并对其组织内的用户用户主体名称 (UPN) 后缀使用多个顶级域。例如, @contoso.us 或 @contoso.de (需要为每个后缀部署单独的 AD FS 2.0 联合身份验证服务实例。 在服务器场中的所有 AD FS 2.0 联合服务器上安装此更新汇总后,请按照 Office 365 使用此功能的说明进行操作,并将新的声明规则设置为根据 Office 365 用户的 UPN 后缀动态生成令牌颁发者 Id。 因此,您无需将 AD FS 2.0 联合服务器的多个实例设置为支持 Office 365 中的多个顶级域的 SSO。

支持多个顶级域

"目前,Microsoft Office 365 客户使用单一登录 (SSO) 通过 AD FS 2.0,并为其组织内的用户用户主体名称 (UPN) 后缀提供了多个顶级域。例如, @contoso.com 或 @fabrikam.com (需要为每个后缀部署单独的 AD FS 2.0 联合身份验证服务实例。现已汇总了 AD FS 2.0 (https://support.microsoft.com/kb/2607496) ,与 "SupportMultipleDomain" 开关结合使用,使 AD fs 服务器能够在不需要其他 AD fs 2.0 服务器的情况下支持此方案。 "

将为 O365 创建 RP 信任的命令如下:

New-MsolFederatedDomain -DomainName<domain>-SupportMultiDomain

Update-MSOLFederatedDomain -DomainName <domain>-SupportMultipleDomain

Convert-MsolDomainToFederated -DomainName <domain>-supportMultipleDomain

MsolFederationProperty- 联合域上的域名现在表明 ADFS 和 O365 的 "FederationServiceIdentifier" 不同。 每个联盟域都将 "FederationServiceIdentifier" 设置为 http:// <domainname> /adfs/services/trust/,而 adfs 配置仍具有http://STSname/adfs/Services/trust

由于配置中不匹配,因此我们需要确保在将令牌发送到 O365 时,它与在 O365 中为域配置的颁发者是同一个。 如果不是,您将收到以下错误:

因此,在使用 SupportMultipleDomain 开关添加或更新 RP 信任时,会自动将第三个声明规则添加到 O365 的 RP 信任中。

默认的第三个规则:

c: [Type = = " http://schemas.xmlsoap.org/claims/UPN](http://schemas.xmlsoap.org/claims/UPN "] => issue (Type = " https://schemas.microsoft.com/ws/2008/06/identity/claims/issuerid ",value = regexreplace (c., +@(?<domain>.+) , http://${domain}/adfs/services/trust/) # A4;

此规则使用用户的 UPN 的后缀值,并使用它生成一个名为 "Issuerid" 的新声明。 示例 http://contoso.com/adfs/services/trust/

使用fiddler,我们可以跟踪传递给 login.microsoftonline.com/login.srf 的令牌。 复制 wresult 中传递的令牌后,将该内容粘贴到记事本中,并将该文件另存为 .xml。 稍后,您可以使用 IE 打开另存为 .xml 文件的令牌,并查看其内容。

Fidder 的屏幕截图

需要注意的是,该规则会发出 "Issuerid" 声明,我们在响应令牌中看不到此声明,事实上,我们看到 "颁发者" 属性修改为新组合的值。

<saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_2546eb2e-a3a6-4cf3-9006-c9f20560097f"Issuer="[http://contoso.com/adfs/services/trust/](http://contoso.com/adfs/services/trust/)" IssueInstant="2012-12-23T04:07:30.874Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">

注释

  • 在未安装 ADFS 汇总1或2的情况下使用 SupportMultipleDomain。 您将看到,由 ADFS 生成的响应令牌包含颁发者 = " http://STSname/adfs/Services/trust " 和声明 "Issuerid",其中包含根据第三个声明规则的组合值。

    <saml:Assertion MajorVersion="1" MinorVersion="1" AssertionID="_2546eb2e-a3a6-4cf3-9006-c9f20560097f"Issuer=`http://STS.contoso.com/adfs/services/trust/` IssueInstant="2012-12-23T04:07:30.874Z" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
    
    …
    
    <saml:Attribute AttributeName="issuerid" AttributeNamespace="[http://schemas.microsoft.com/ws/2008/06/identity/claims](http://schemas.microsoft.com/ws/2008/06/identity/claims)"><saml:AttributeValue>[http://contoso.com/adfs/services/trust/</saml:AttributeValue](http://contoso.com/adfs/services/trust/%3c/saml:AttributeValue)></saml:Attribute>
    - This will again lead to error "Your organization could not sign you in to this service"
    

对子域的支持

"请务必注意,当您具有单个顶级域和多个子域时,不需要" SupportMultipleDomain "开关。例如,如果用于 upn 后缀的域是 @sales.contoso.com , @marketing.contoso.com 并且 @contoso.com 顶级域 (contoso.com 在这种情况下,) 先添加,然后联合,则无需使用 "SupportMultipleDomain" 开关。这是因为这些子域在父域中有效管理,并且可以使用单个 AD FS 服务器来处理这种情况。

但是,如果您有多个顶级域 (@contoso.com 和 @fabrikam.com) ,并且这些域也有子域 (@sales.contoso.com 并且 @sales.fabrikam.com) "SupportMultipleDomain" 开关不适用于子域,并且这些用户将无法登录。

在上述方案中,此开关为什么不起作用?

回答:

  • 对于子域,共享同一个命名空间,我们不会单独联合它们。 联合根域也会覆盖子域,这意味着子域的 federationServiceIdentifier 值也将与父域的值相同,亦即 https://contoso.com/adfs/services/trust/

  • 但第三个声明规则(最后是领料,为用户构成颁发者值的最终状态结束 https://Child1.contoso.com/adfs/services/trust/ )会再次导致不匹配,从而导致 "您的组织无法将您登录到此服务" 错误。

    若要解决此问题,我们可以修改第三个规则,以使其在 O365 结束时生成一个与 "FederationServiceIdentifier" 匹配的 Issuer 值。 2此方案中可使用的不同规则如下所示。 此规则只是从 UPN 后缀中选取根域以构成 Issuer 值。 对于 UPN 后缀 child1.contoso.com,它仍将生成一个 Issuer 值, https://contoso.com/adfs/services/trust/ 而不是 https://Child1.contoso.com/adfs/services/trust/ 使用默认规则 ()

声明规则的屏幕截图

自定义的第三个规则

规则1:

c:[Type == `http://schemas.xmlsoap.org/claims/UPN`]
=> issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/issuerid", Value = regexreplace(c.Value, "^((.*)([.|@]))?(?<domain>[^.]*[.].*)$", "http://${domain}/adfs/services/trust/"));

规则2:

c:[Type == `http://schemas.xmlsoap.org/claims/UPN`]
=> issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/issuerid", Value =regexreplace(c.Value, "^((.*)([.|@]))?(?<domain>[^.]*.(com|net|co|org)(.\w\w)?)$", "[http://${domain}/adfs/services/trust/](http://$%7bdomain%7d/adfs/services/trust/)"));

注释

上述规则可能不适用于所有方案,但可以对其进行自定义,以确保 "Issuerid" 值与在 O365 结束添加/联合域的 "FederationServiceIdentifier" 匹配。

此外,还可以修改域的 ADFS 和 O365 之间的 federationServiceIdentifier 不匹配,也可以在 O365 结束时修改域的 "federationServiceIdentifier",以匹配 ADFS 的 "federationServiceIdentifier"。 但只能为一个联合域配置 federationServiceIdentifier,而不能为全部。

MSOLDomainFederationSettings-domain name Contoso.com – issuerurihttp://STS.contoso.com/adfs/services/trust/

有关可帮助您编写自己的声明规则的详细信息。 * *