Python3使用微软AD域账号认证


环境:Centos7 + Python3.8.0
使用python包:

  1. pip3 list
  2. python-ldap 3.3.1

示例中使用的参数:
域控ip、域、密码: 192.168.1.1 ,”bj.localnetwork.cn”, ‘123456789’

公共账户DN信息(CN项为公共邮箱中文名):
CN=邮箱中文名,OU=公共邮箱,OU=Person,DC=bj,DC=localnetwork,DC=cn

用户OU:
OU=Person,DC=bj,DC=localnetwork,DC=cn

LDAP:什么是DN
在LDAP协议中,DN用于指向一个LDAP对象,DN由一系列RDN(relative distinguished names)组成。
RDN之间用“逗号”隔开,它是一个键值对,格式为:attribute=value

  1. # Copyright: (c) OpenSpug Organization. https://github.com/openspug/spug
  2. # Copyright: (c) <spug.dev@gmail.com>
  3. # Released under the AGPL-3.0 License.
  4. #from apps.setting.models import Setting
  5. import ldap
  6. import json
  7. class LDAP:
  8. def __init__(self):
  9. #server_info = Setting.objects.filter(key='ldap_service').first()
  10. #ldap_info_dict = json.loads(server_info.value)
  11. self.server = "192.168.1.1"
  12. self.port = "389"
  13. # self.rules = ldap_info_dict['rules']
  14. self.admin_dn = "CN=技术部邮箱,OU=公共邮箱,OU=Person,DC=bj,DC=localnetwork,DC=cn"
  15. self.password = "123456789"
  16. self.base_dn = "OU=Person,DC=bj,DC=localnetwork,DC=cn"
  17. def valid_user(self, username, password):
  18. try:
  19. print("准备连接ldap")
  20. conn = ldap.initialize("ldap://{0}:{1}".format(self.server, self.port), bytes_mode=False)
  21. print("验证")
  22. conn.simple_bind_s(self.admin_dn, self.password)
  23. print("连接ldap成功")
  24. #search_filter = f'({self.rules}={username})'
  25. search_filter = "sAMAccountName=" + username
  26. ldap_result_id = conn.search(self.base_dn, ldap.SCOPE_SUBTREE, search_filter, None)
  27. print("准备搜索用户")
  28. result_type, result_data = conn.result(ldap_result_id, 0)
  29. if result_type == ldap.RES_SEARCH_ENTRY:
  30. print("找到用户")
  31. dn = result_data[0][0]
  32. #user_info = result_data[0][1]
  33. #print(dn)
  34. if conn.simple_bind_s(dn, password):
  35. print("用户:%s LDAP认证成功" % username)
  36. return True, None
  37. else:
  38. print("用户:%s LDAP认证失败" % username)
  39. return False, None
  40. else:
  41. print("认证失败")
  42. return False, None
  43. except Exception as error:
  44. args = error.args
  45. print("ldap发生意外")
  46. return False, args[0].get('desc', '未知错误') if args else '%s' % error

local 2021年11月18日 10:19 收藏文档