Office 365 ADFS 身份验证不适用于子域

Office 365 ADFS 身份验证不适用于子域

某公司正在使用带有 ADFS 身份验证的 Office 365;AD Connect 用于目录同步,ADFS 是 Windows server 2012 R2 版本。

该公司有多个 Active Directory 域:

parent1.com
    child1.parent1.com
    child2.parent1.com
    child3.parent1.com
parent2.com
    ...
...

根域在 Office 365 中配置为联合域(公共域名和 AD 域名相同);这可以正常工作,用户可以使用他们的 UPN(例如[email protected])和他们的 AD 密码登录 Office 365。

我需要添加对子域的支持;因此我child1.parent1.com通过运行以下命令将其添加到 Office 365(使用 以管理员帐户连接到 Office 365 之后Connect-MsolService):

New-MsolFederatedDomain -DomainName child1.parent1.com -SupportMultipleDomain

(注意:如果我没有使用该SupportMultipleDomain参数,PowerShell 会给出一个错误,指出该参数是必需的)。

然后我继续添加所有必需的 DNS 记录,包括私有 DNS 和公共 DNS;Office 365 对 DNS 记录的验证报告一切正常。

然后将子域添加到 AD Connect,并执行同步;因此,子域中的用户出现在 Office 365 中,其用户名为[email protected]。我为他们分配了适当的许可证,并尝试登录 Office 365 门户。

但是,子域的用户无法登录;他们收到“无效请求”错误,并包含以下其他详细信息:

Correlation ID: b1e47d45-b21c-42e9-9758-265804db7171 
Timestamp: 2016-08-10 20:27:48Z 
AADSTS50107: Requested federation realm
object 'http://child1.parent1.com/adfs/services/trust/' does not exist. 

ADFS 方面显然存在问题,但我不是这方面的专家,也不是我设置它的人;我该如何解决这个问题,以便子域中的用户可以成功登录 Office 365?

答案1

这个问题很少有记录(Technet 博客文章Azure AD 的一些文档),但它确实存在,并且是由 ADFS 在某些特定情况下(多个顶级联合域和混合使用联合子域)行为不正确引起的;解决方案涉及编辑 ADFS 声明规则中的正则表达式,该规则用于构建与用户的 UPN 关联的 IssuerUri。引用第二篇文章:

So lets say for example that I have bmcontoso.com and then add
corp.bmcontoso.com. This means that the IssuerUri for a user from
corp.bmcontoso.com will need to be http://bmcontoso.com/adfs/services/trust.
However the standard rule implemented above for Azure AD, will generate a
token with an issuer as http://corp.bmcontoso.com/adfs/services/trust
which will not match the domain's required value and authentication will fail.

为了解决这个问题,应该编辑 ADFS 中的第三个声明规则,从

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/"));

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/"));

但是,请注意,这可能会破坏与其他场景的兼容性,例如,实际的三级联合域,其父域未联合。

相关内容