使用 python-ldap 向 Active Directory 进行身份验证始终返回 (97, [])

2024-03-28

如同这个问题 https://stackoverflow.com/questions/140439/authenticating-against-active-directory-using-python-ldap,我尝试使用 python ldap (CentOS 6.2 x86_64、Python 2.6.6、python-ldap 2.3.10)对 2003 Active Directory 执行简单身份验证。

尽管遵循了 init 中的所有常规步骤,包括

conn.set_option(ldap.OPT_REFERRALS, 0)

如果我通过了正确的凭据我always get a (97, [])回到:

>>> import ldap
>>> conn = ldap.initialize('ldap://ad.server.domain.com')
>>> conn.protocol_version = 3
>>> conn.set_option(ldap.OPT_REFERRALS, 0)
>>> conn.simple_bind_s('[email protected] /cdn-cgi/l/email-protection', 'WrongPassword')
ldap.INVALID_CREDENTIALS: {'info': '80090308: LdapErr: DSID-0C090334, comment: AcceptSecurityContext error, data 52e, vece', 'desc': 'Invalid credentials'}
>>> conn.simple_bind_s('[email protected] /cdn-cgi/l/email-protection', 'CorrectPassword')
(97, [])

错误代码97表示未成功;这是LDAP_REFERRAL_LIMIT_EXCEEDED从 AD 返回错误。我也不能用它作为de facto成功指标,因为:

>>> conn.simple_bind_s('', 'CorrectPassword')
(97, [])
>>> conn.simple_bind_s('', '')
(97, [])

更令人沮丧的是,该脚本是使用 Net::LDAP 从旧 Perl 脚本迁移而来的,它does如果成功通过身份验证绑定到同一 AD 和服务器,则返回 0。

我在 python-ldap 上找到的所有信息都表明我所做的应该只是工作;我倾向于认为 AD 服务器有问题,但 Perl 脚本确实在成功绑定时返回正确的 LDAP 代码。

我已经在我闲置的旧 CentOS 5.5 机器上测试了 python-ldap 2.2.0 和 python 2.4.4,但它以完全相同的方式“失败”。

有谁知道我缺少什么?

编辑:根据请求,这里是有效的 Perl 脚本。Net::LDAP从 LDAP 服务器返回返回码,AD 服务器返回 0x00,“请求成功”,AFAICT。

#!/usr/bin/perl -w
use strict;
use Net::LDAP;

## Corporate subdomains
my @domains = ("americas", "asia", "europe");

# AD connect timeout
my $timeout = 10;
# Set AD server info.
my $port = "389";
my $host = "server.domain.com";

my $user = shift @ARGV;
chomp $user;

my $password = <STDIN>;
$password =~ s/\r\n//;
chomp $password;

my $ldap = Net::LDAP->new($host, port => $port, timeout => $timeout ) ||
        die "Unable to connect to LDAP server";

my $bind_return = 1;
foreach (@domains) {
        my $result = $ldap->bind( "$user\@$_.domain.com", password => $password );
        if( $result->code == 0) {
                $bind_return = 0;
                last;
        }
}

## Unbind and return
$ldap->unbind;

if ($bind_return) { print "Authentication Failed.  Access Denied\n" }
exit $bind_return;

python-ldap 库的作者 Michael Ströder 如此启发了我:

97 不是 LDAP 结果代码。这是结果类型 ldap.RES_BIND。一般情况下你不必查看返回的结果 通过 LDAPObject.simple_bind_s() (除非您想提取绑定 响应控制)。

如果 LDAP 结果代码不为 0,则会引发伴随的异常 就像您的示例中的 ldap.INVALID_CREDENTIALS 一样。

所以你的代码应该是这样的:

try:
  conn.simple_bind_s('[email protected] /cdn-cgi/l/email-protection', 'WrongPassword')
except ldap.INVALID_CREDENTIALS:
  user_error_msg('wrong password provided')

产生这些结果的原因:

>>> conn.simple_bind_s('', 'CorrectPassword')
(97, [])
>>> conn.simple_bind_s('', '')
(97, [])

是开箱即用的 2003 Active Directory允许匿名绑定 http://www.petri.co.il/anonymous_ldap_operations_in_windows_2003_ad.htm。因此,如果唯一测试的是是否存在,则根本不提供用户 ID 仍将通过简单的绑定检查simple_bind_s()抛出错误。

2003 活动目录does需要对不属于 rootDSE 属性的任何搜索进行身份验证,因此出于我们的内部目的,我们向try: block:

try:
  conn.simple_bind_s('[email protected] /cdn-cgi/l/email-protection', 'SubmittedPassword')
  conn.search_st('DC=domain,DC=com', ldap.SCOPE_SUBTREE, '(objectClass=container)', 'name', 0, 30)
except ldap.INVALID_CREDENTIALS:
  user_error_msg('wrong password provided')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 python-ldap 向 Active Directory 进行身份验证始终返回 (97, []) 的相关文章

随机推荐

  • ASPNETDB.MDF 文件未显示在 APP_DATA 中

    我正在了解 Microsoft 关于 MVC 2 表单身份验证的演练 http msdn microsoft com en us library ff398049 aspx http msdn microsoft com en us lib
  • 找不到 support-fragment.jar (com.android.support:support-fragment:27.0.2)

    我克隆了我的项目并使用 Android studio 打开 但构建失败并出现以下错误同一个项目对其他人来说运行良好 What went wrong Could not resolve all files for configuration
  • 字符串比较 Objective-C

    我一直在努力进行简单的比较 但无法让它发挥作用 我正在读取一个 XML 文件 我需要比较其中的数据才能显示正确的图片 http www cleaner se larm xml http www cleaner se larm xml 解析示
  • 带有数字键的 Django postgres Json 字段

    我有带有 postgres json 字段的模型 class MyModel models Model data JSONField null True 然后 我这样做 m1 MyModel objects create data 10 2
  • 摆脱 django testsuite 中的空 models.py

    我有两个纯服务应用程序 它们充当我的核心模型的仆人 因此 他们没有任何自己的模型 虽然第一个服务的测试套件运行良好 但第二个服务会抛出以下错误 django core exceptions ImproperlyConfigured App
  • C++:在另一个函数中声明一个函数不是编译器错误,那么...它是什么?

    我无意中编译了一个与此类似的源 void y optionally declaring y void x some code void y some code void y some code optionally defining y 这
  • python re.search 不适用于多行字符串

    我已将此文件加载到字符串中 some preceding stuff static char header data 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1
  • py中的pyc文件反编译失败

    感谢您的关注 我有一个pyc文件 我需要获取它的源代码 我已经尝试了很多库 但是版本有错误 这是尝试反编译时的命令行输出 C Users nigga22nd Downloads gt uncompyle6 bot pyc uncompyle
  • .NET中的序列号(注册密钥)算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有一些关于 IP 安全等的及时帖子 但我找不到专门针对算法的帖子 在我当前的一个项目中 我们决定采用离线注册密钥系统的路线 我想我们最
  • NSD昨天的日期

    我如何创建一个NSDate具有当前日期以外的自定义日期的对象 例如 我想创建昨天或两天前的变量 你应该使用NSCalendar https developer apple com library mac documentation Coco
  • 使用QMediaPlayer播放资源中的mp3文件

    我尝试播放资源中声明的 mp3 文件 但它显示 Btn clicked current media qrc sound sound FarAway mp3 Error QMediaPlayer FormatError Media state
  • 读取字符串和整数

    我想要做的是从文本文件中读取一行 其中包含一个长度 Name Surname 1 14 我知道如果我读取字符串 字符串将是所有字符 直到空格 但是 getline 将整行读取为字符串 那么我该如何阅读这样的一行呢 有什么简单的方法或者我必须
  • 将字符串拆分为字符串数组

    我正在尝试找到一种将字符串拆分为字符串数组的方法 每当遇到白色香料时我都需要将其拆分 例如 嗨 我是保罗 into 嗨 我是 保罗 如何使用正则表达式表示 split 方法中的空格 你需要一个正则表达式 例如 s 意思是 每当遇到至少一个空
  • angularjs Nodejs应用程序的最佳部署架构

    我在 AngularJS 和 NodeJS 中有 Moto Adverts 应用程序 Angularjs client side 在 Apache HTTP Server localhost 8000 上运行 但 nodejs server
  • Qt 单例实现

    我正在寻找 Singleton Qt 实现并发现this https wiki qt io Qt thread safe singleton 但我对此有一些疑问 制作的目的是什么create a QBasicAtomicPointer 重点
  • 使用 ScikitLearn 的神经网络实现时出现的问题

    我正在尝试使用 Scikit Learn 提供的神经网络实现来实现图像处理 我有近 10 000 张 JPG 格式的彩色图像 我将这些图像转换为 PNG 格式并删除了颜色信息 新图像都是黑白图像 将这些图像转换为矢量格式后 这些图像矢量形成
  • Pascal 支持向函数传递参数吗?

    我是 Pascal 新手 我正在尝试编写一个简单的程序 但在函数之间传递值时遇到问题 这是我所拥有的一小部分 program numberConverter const maxValue 4999 minValue 1 var num in
  • @echo 在cmd中关闭

    我正在尝试编写一个 BAT 脚本 我有以下内容 echo off REM Comments here SETLOCAL ENABLEDELAYEDEXPANSION set PROG ROOT C Prog set ONE 1 echo 1
  • .htaccess文件自动修改

    我有由 WordPress 提供支持的网站 并且 WordPress 根文件夹中也有 html 文件 因为 WordPress 不允许 html 文件 我编写了 htaccess 代码来打开 html 文件以及 WordPress 页面 但
  • 使用 python-ldap 向 Active Directory 进行身份验证始终返回 (97, [])

    如同这个问题 https stackoverflow com questions 140439 authenticating against active directory using python ldap 我尝试使用 python l