我希望有人可以帮助我,因为这已经困扰了我很长一段时间了。我有一个域控制器设置与kerberos装甲启用包括在已发行的kerberos门票中的索赔。然后,我将动态访问控制配置为定义一些要包含在kerberos票证中的声明类型。当我使用System.Security.Principal.WindowsIdentity使用简单的PowerShell脚本测试当前用户身份中包含的所有声明时,kerberos票证似乎包含已定义的声明类型,我认为这些声明是从现有用户获得的kerberos门票。
然后我配置了与Active Directory DC集成的Active Directory联合身份验证服务作为声明提供者信任,我将SAML测试Web应用程序设置为服务器作为服务提供者/依赖方。如果我使用"发送LDAP属性作为声明"则设置有效。在信赖方信托中查询AD并获得索赔。
但是,我想要做的是获取kerberos票证中包含的声明并将其包含在AD FS发布的SAML令牌中,因为用户通过Windows集成登录执行SSO。我尽力了#34; Pass Through"声明提供商信任和信赖方信任中的规则从kerberos票证中提取这些声明并将其包含在AD FS中生成的SAML令牌中,但似乎都不起作用。我甚至创建了一个自定义规则,只是通过所有声明,但似乎没有工作。似乎kerberos门票甚至不包含我在动态访问控制中定义的相关声明,因为我能够通过诸如UPN,组SID,名称等的kerberos中的默认声明。但是如果它'我在动态访问控制中定义的自定义声明要包含在kerberos票证中,它们似乎不存在。 任何人都可以帮助我进一步诊断吗?
仅供参考,我使用的测试网络应用程序是simpleSAMLphp,我只是用它来显示它从AD FS发出的SAML令牌收到的所有声明/属性。
这是我用来测试的PS脚本,看到当前用户的kerberos票证包含我在动态访问控制中定义的声明类型:
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent()
$Username = $CurrentUser.Name
Write-Output "User: $Username`n"
Write-Output "---- CLAIMS ----`n"
$Claims = $CurrentUser.Claims
foreach ($claim in $Claims) {
# Get Claim Type
if ($claim.Type -match "http://") {
$claimType = ($claim.Type).Split('/')[($claim.Type).Split('/').Count -1]
}
elseif ($claim.Type -match "ad://") {
$claimTypeName = ($claim.Type).Split(':')[($claim.Type).Split(':').Count -2]
$claimType = $claimTypeName.Split('/')[$claimTypeName.Split('/').Count -1]
}
# Transform
if ($claimType -eq "groupsid") {
$claimType = "group"
}
# Get Claim Value
$claimValue = $claim.Value
if ($claimValue -match "S-" -and $claimType -eq "group") {
try {
$SIDvalue = New-Object System.Security.Principal.SecurityIdentifier($claimValue)
$accountName = $SIDvalue.Translate([System.Security.Principal.NTAccount])
$claimValue = $accountName
}
catch {
Write-Verbose "WARNING: Unable to get group name attribute of SID $SIDvalue"
$claimType = "groupsid"
}
}
Write-Output "$claimType`: $claimValue"
}
如果我可以提供任何其他信息来帮助诊断此问题,请告知我们。
提前谢谢。