我正在尝试创建一个使用LDAP服务器进行身份验证的登录页面。 我使用以下信息,它适用于LDAP客户端。
Host: ldap.med.xxx.edu
Port: 389
Protocol: v3
Base DN: ou=som,dc=med,dc=xxx,dc=edu
Security level: User + Password
User DN: MED\myusername
Password: mypassword
然后我有以下代码:
function ldap_authentication($uname, $password)
{
$ldaprdn = "uid=MED\\$uname,ou=som,dc=med,dc=xxx,dc=edu";
$ldappass = "$password";
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$ldapconn = @ldap_connect("ldap.med.xxx.edu",389) or die("Cannot connect to LDAP server!");
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
if($ldapconn)
{
$ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);
if($ldapbind)
{
return "Success...";
}
else
{
return "Failed to bind..." . ldap_error($ldapconn);
}
}
else {
return "Cannot Connect";
}
return "Unknown error...";
}
现在这个PHP代码返回"无法绑定...无效的Credenitials"
知道我在这里做错了吗?
答案 0 :(得分:1)
我认为您必须使用sAMAccountName=$uname,ou=som,dc=med,dc=xxx,dc=edu
或MED\\$uname
作为绑定。
最后一个是一个特殊的ActiveDirectory功能。第一个考虑到AD上的唯一ID名为sAMAccountName
而不是uid
答案 1 :(得分:0)
我在尝试通过LDAP登录Active Directory时遇到“无效凭据”的问题类似,但仅针对某些用户。我尝试使用/删除Where-Object
,无论是单反斜杠还是双反斜杠,都无济于事。我尝试过的每个帐户都验证了登录凭据,但只有一个(我的,奇怪的是)工作,而其他具有更多或更少权限,不同或相同组的其他帐户都失败了。我发现解决问题的方法是:存储RDN的变量$ ldaprdn采用以下格式:
$ExcludedPaths = @(Import-Csv -LiteralPath 'D:\ExclusionList.csv') |Select-Object -Expand ExcludedPaths
$ExcludedFiles = @(Import-Csv -LiteralPath 'D:\ExclusionList.csv') |Select-Object -Expand ExcludedFiles
$Filter = {
$FullName = $_.FullName
-not($ExcludedPaths|Where-Object {
$FullName -like "$_*"
})
}
$SourceFiles = Get-ChildItem -Recurse -Path $SourceDir -Exclude $ExcludedFiles -Force | Where-Object -FilterScript $Filter
$DestFiles = Get-ChildItem -Recurse -Path $DestDir -Exclude $ExcludedFiles -Force | Where-Object -FilterScript $Filter
出于某种原因,除了我之外的所有帐户都失败了(运行我正在处理的内部网站点的Web服务器在我的工作站上,可能相关或不相关),但对其他所有用户都失败了。通过将RDN字符串更改为:
domain_prefix\
它现在适用于所有有效帐户。我完全不知道为什么会这样,为什么所有登录凭据都保存为我的失败,或者为什么删除大括号“修复”了问题。如果有人知道为什么这个看似微不足道的变化有如此奇怪的效果,我全都听见了。