背景


内部用keycloak实现SSO,近期引入了Office365,需要接入keycloak(saml协议),实现SSO。

遇到的问题


Office365按照官方文档配置后,负责keycloak的同学帮着调试好后,sso总是提示失败。总是提示找不到用户。

按照官方文档 https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/how-to-connect-fed-saml-idp 的说明, NameID和IDPEmail 需要传递,也都传递了。

image.png

负责跟进Case的小姐姐给的结论是NameID传的值是邮箱前缀或者邮箱,不符合O365的要求,要求传的值必须是ImmutableID,这样才能识别为用户存在。 如图示 image.png

KeyCloak 中导入 https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml ,NameID格式只有username、email、transient、persistent4个属性。

image.png

处理方式


经过了解ImmutableID 默认是由AD中ObjectGUID base编码而来。 NameID 对应AD中的sAMAccountName字段。 尝试手动设置AzureAD中的ImmutableID属性值为sAMAccountName。

Install-Module AzureAD
Connect-AzureAD
#查询ImmutableID 
Get-AzureADUser -Filter "Displayname eq 'shizhenning01'" | fl ImmutableID
#设置ImmutableID
Get-AzureADUser -Filter "Displayname eq 'shizhenning01'" | Set-AzureADUser -ImmutableId "shizhenning01"

再尝试登录,SSO顺利通过。

接下来的问题就是修改AADConnect映射规则,让AD中的sAMAccountName自动映射为ImmutableID,AzureAD中对应的属性sourceAnchor。

对映射规则了解的比较少,尝试增加映射规则,优先级调高,始终不能生效。 开了个Case只需在AADConnect安装过程中选中即可,如图示位置:

image.png

这样sAMAccountName字段值会自动同步到AzureAD中用户的ImmutableID值。