我已在 ADFS 中配置了声明提供商信任,但只能获取Email
。NameID
我无法更改第三方声明提供商信任,因此我必须WindowsAccountName
使用从第三方 IDP 收到的 NameID 中的电子邮件地址获取,并将其转发到 Outlook Web Access(本地)。
我发现当我使用以下声明规则时,登录有效,但前提是用户的 UPN 和电子邮件地址匹配。如果它们之间存在差异(例如 sAMAccountName=jdoe;[电子邮件保护];電子郵件=乔纳森·多伊@contoso.com),转发到 Exchange 的值会导致抛出错误。
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] == "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"]
=> issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer = "AD AUTHORITY", OriginalIssuer = c.OriginalIssuer, Value = regexreplace(c.Value, "(?<user>[^\@]+)\@(.+)", "contoso\${user}"), ValueType = c.ValueType);
我如何通过电子邮件地址查找用户并WindowsAccountName
以domain\username
格式返回他们的信息?
答案1
如果有人遇到这个问题。你需要两条规则。
规则 1:sAMAccountName 为 temp 这告诉 ADFS 在 ActiveDirectory 中查找并返回 UPN 或电子邮件地址匹配的任何帐户。然后规则将值存储到临时变量中,我们将在下一个规则中使用该变量。
c:[Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] == "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"]
=> issue(store = "Active Directory", types = ("claims:temp/attribute1"), query = "(&(objectCategory=person)(objectClass=user)(|(userPrincipalName={0})(mail={0})));sAMAccountName;contoso\adfs_service_account", param = c.Value);
注意:这contoso\adfs_service_account
很重要。ADFS 需要它来自动发现域控制器。使用任何 AD 帐户,只要它是一个真实帐户即可。
规则 #2:将 temp 转换为 WindowsAccountName 上述规则仅返回 sAMAccountName,而不是域。就我而言,我只有一个域。因此,我在下面对其进行了硬编码。
c:[Type == "claims:temp/attribute1"] => issue(Type = "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer = "AD AUTHORITY", OriginalIssuer = "https://contoso.verify.ibm.com/saml/sps/saml20ip/saml20", Value = "contoso\" + c.Value);