ADFS - 结合提供商信任和 AD 的声明

ADFS - 结合提供商信任和 AD 的声明

作为实施 SharePoint 2013 安装的一部分,我已经在 Windows Server 2012R2 上使用 ADFS 配置了 SSO。

有两个独立的 AD 林,一个是托管 SharePoint/ADFS 的一部分,一个是现场企业林。

目前,我已将企业 AD 设置为Claims Provider TrustSharePoint ADFS我能够成功地将电子邮件属性从企业 AD 传递到 SharePoint。

我想要实现的是在Hosted AD Forest使用帐户登录时注入某种形式的声明Corporate AD
具体来说,用户将成为安全组的成员,以确定 SharePoint 许可。出于安全原因,我不想从公司 AD 获取此声明信息,因为这意味着用户将能够更改其许可状态。

因此,所有用户实际上在两个林中都拥有一个 AD 帐户。通过在登录过程中输入公司凭据即可提供单点登录。

有没有什么方法可以让我告诉我hosted ADFS在自己的 AD 林中寻找与 来自 匹配的用户incoming Email Address ClaimCorporate ADFS然后使用所述电子邮件声明Role claim从注入?hosted forest

请参见下面的图片了解我想要实现的目标(抱歉,MS Paint 绘图太快了!): ADFS 问题描述

我如何实现步骤 4 和 5?

现行申索规则
在 上Hosted ADFSAcceptance Transform Rules对于Corporate Claim Provider Trust

  1. 传递传入电子邮件地址声明,传递所有值

在 上Hosted ADFSIssuance Transform Rules对于SharePoint Relying Party

  1. 将 LDAP 属性作为声明发送(UPN -> UPN、令牌组 -> 角色、电子邮件地址 -> 电子邮件)
  2. 传递传入电子邮件地址声明,传递所有值

答案1

是的,这应该可行。如果您控制托管 ADFS 上的声明规则,并且您在声明中拥有来自 Corp ADFS 的某些密钥,那么您可以使用该密钥执行常规 AD 搜索声明规则。

答案2

我最终让它工作了,事实上它并不像我想象的那么糟糕——我只需要Issuance Transform Rule在我的 SharePoint 依赖方上编写一个自定义代码。

这就是我想出的:

c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"]
 => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn", "http://schemas.microsoft.com/ws/2008/06/identity/claims/role"), query = "userPrincipalName={0};userPrincipalName,tokenGroups;MYDOMAIN\accountthatdoesnotexist", param = c.Value);

本质上,这将看到,如果在传入声明集中定义了电子邮件地址声明,它将使用电子邮件地址查询 AD 并找到与userPrincipalName匹配的email address。然后它只是返回upntokenGroups属性作为我需要的upn和声明。role

我已将其作为规则 1 插入到我的依赖方中。因为有些用户没有第三方 ADFS 来进行身份验证,所以我相信这应该会给它带来最大的兼容性。

在使用发送 AD 属性模板时检查默认声明代码后,它只会在规则收到时才实际运行windowsaccountname claim(只有在用户没有第三方 ADFS 的情况下登录时,此声明才会传递给依赖方)。

因此,我遇到一种情况,如果用户正在登录without a third party ADFS,它将忽略我的自定义规则,因为 Active Directory 属性存储不会发送email address claim。此外,如果用户正在登录WITH a third party ADFS,它将忽略Send LDAP Attributes规则,因为没有windowsaccountname设置声明!

最后,在我第一次尝试时,我最初以为自己卡住了,因为我只使用 UPN,而不是托管 AD 中的传统域\用户名帐户,因为我在事件日志中收到了一条错误消息:

Microsoft.IdentityServer.ClaimsPolicy.Engine.AttributeStore.AttributeStoreQueryFormatException: 
POLICY3826: 
User name '[email protected]' in LDAP query';userPrincipalName,tokenGroups;[email protected]' 
is not in the required 'domain\user' format.

然而,对我来说好消息是域\用户名的用户名部分实际上被忽略了!https://technet.microsoft.com/en-us/library/adfs2-help-attribute-stores%28WS.10%29.aspx

QUERY = <QUERY_FILTER>;<ATTRIBUTES>;<DOMAIN_NAME>\<USERNAME>

查询的这一部分识别并定位要连接的域控制器以执行 LDAP 查询

另请注意,即使对于 Active Directory 属性存储,USERNAME 也会被忽略。

因此,只需稍加调整以确保 LDAP 过滤器匹配userPrincipalName而不是默认匹配(如果查询过滤器留空)samAccountName,现在就可以完美运行!

相关内容