ADFS – 结合提供者信托和AD的索赔

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

有两个独立的AD森林,一个是托pipeSharePoint / ADFS的一部分,另一个是现场公司林。

目前,我已经在SharePoint ADFS中将公司AD设置为Claims Provider Trust 。 我能够成功通过从公司AD到SharePoint的电子邮件属性。

我想实现的是从Hosted AD Forest索赔的一些forms,作为loginCorporate AD账户的一部分。
具体而言,用户将成为安全组的成员,以确定SharePoint许可。 出于安全原因,我不希望从Corporate AD获得此声明信息,因为这意味着用户将能够更改其许可状态。

所以,所有用户在两个森林中实际上都会有一个AD帐户。 单点login通过在login过程中input其公司凭据来提供。

有什么方法可以告诉我的hosted ADFS在自己的AD林中查找与来自Corporate ADFSincoming Email Address Claim相匹配的用户,然后从所hosted forest向所述电子邮件声明注入Role claim声明?

请参阅下面的图片,我想实现(对不起,快速MS Paint绘图!): ADFS问题描述

我如何实现步骤4和5?

现行索赔规则
Hosted ADFSCorporate Claim Provider Trust Acceptance Transform Rules

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

Hosted ADFSSharePoint Relying Party Issuance Transform Rules

  1. 发送LDAP属性作为声明(UPN – > UPN,令牌组 – >angular色,电子邮件地址 – >电子邮件)
  2. 通过传入的电子邮件地址声明,通过所有值

是的,这应该工作。 如果您控制托pipe的ADFS上的声明规则,并且如果您在声明中拥有来自Corp ADFS的某个密钥,则可以使用该密钥执行常规的ADsearch声明规则。

我最终得到了这个工作,实际上并没有我想象的那么糟糕 – 我只需要在SharePoint依赖方上编写一个自定义Issuance Transform Rule

这就是我想到的:

 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并查找与该email address匹配的userPrincipalName 。 然后,它只是返回upntokenGroups属性作为我需要的upnrole声明。

我在我的依赖方中插入了这个作为规则编号1。 因为有些用户不会有第三方的ADFS授权,我相信这应该给它最大的兼容性。

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

所以我有这样的情况,如果用户在without a third party ADFS的情况下login,它将忽略我的自定义规则,因为Active Directory属性存储不发送email address claim 。 另外,如果用户WITH a third party ADFSlogin,则由于没有设置windowsaccountname声明,它将忽略“ Send LDAP Attributes规则!

最后,在我的第一次尝试,我最初以为我被卡住,因为我只是使用UPNs而不是传统的域\用户名帐户在托pipe的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也会被忽略。

所以稍作调整以确保LDAPfilter匹配userPrincipalName而不是默认值(如果查询filter保留空白) samAccountName ,这现在是完美的工作!