背景


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

联合域配置


  • 配置联合域【多个域执行多次即可】

Connect-MGGraph -Scopes "Domain.ReadWrite.All", "Directory.AccessAsUser.All"

$dom = "example.com"
$BrandName = "Sample SAML 2.0 IDP example.com"
$LogOnUrl = "https:///realms/realm-test/protocol/saml"
$LogOffUrl = "https:///realms/realm-test/protocol/saml"
$ecpUrl = "https:///realms/realm-test/protocol/saml"
$MyURI = "https:///realms/realm-test"
$MySigningCert = "Qg0JADiQ4"
$Protocol = "saml"

New-MgDomainFederationConfiguration `
  -DomainId $dom `
  -ActiveSignInUri $ecpUrl `
  -IssuerUri $MyURI `
  -PassiveSignInUri $LogOnUrl `
  -PreferredAuthenticationProtocol $Protocol `
  -SignOutUri $LogOffUrl `
  -SigningCertificate $MySigningCert `
  -FederatedIdpMfaBehavior  "rejectMfaByFederatedIdp"
  • Get联合域配置
 Get-MgDomainFederationConfiguration -DomainId "example.com"
  • 恢复联合域到Managed
Update-MgDomain -DomainId "example.com" -AuthenticationType Managed

遇到的问题


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值。