作为实施 SharePoint 2013 安装的一部分,我已经在 Windows Server 2012R2 上使用 ADFS 配置了 SSO。
有两个独立的 AD 林,一个是托管 SharePoint/ADFS 的一部分,一个是现场企业林。
目前,我已将企业 AD 设置为Claims Provider Trust
。SharePoint ADFS
我能够成功地将电子邮件属性从企业 AD 传递到 SharePoint。
我想要实现的是在Hosted AD Forest
使用帐户登录时注入某种形式的声明Corporate AD
。
具体来说,用户将成为安全组的成员,以确定 SharePoint 许可。出于安全原因,我不想从公司 AD 获取此声明信息,因为这意味着用户将能够更改其许可状态。
因此,所有用户实际上在两个林中都拥有一个 AD 帐户。通过在登录过程中输入公司凭据即可提供单点登录。
有没有什么方法可以让我告诉我hosted ADFS
在自己的 AD 林中寻找与 来自 匹配的用户incoming Email Address Claim
,Corporate ADFS
然后使用所述电子邮件声明Role claim
从注入?hosted forest
请参见下面的图片了解我想要实现的目标(抱歉,MS Paint 绘图太快了!):
我如何实现步骤 4 和 5?
现行申索规则
在 上Hosted ADFS
,Acceptance Transform Rules
对于Corporate Claim Provider Trust
:
- 传递传入电子邮件地址声明,传递所有值
在 上Hosted ADFS
,Issuance Transform Rules
对于SharePoint Relying Party
:
- 将 LDAP 属性作为声明发送(UPN -> UPN、令牌组 -> 角色、电子邮件地址 -> 电子邮件)
- 传递传入电子邮件地址声明,传递所有值
答案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
。然后它只是返回upn
和tokenGroups
属性作为我需要的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
,现在就可以完美运行!