0

我已将此类作为 django 中的身份验证后端插入

class ActiveDirectoryBackend(object):

    logger = Messenger.infrastructure

    @classmethod
    def authenticate(cls, username=None, password=None):

        try:
            bind_dn = "%s@%s" % (username, settings.AD_DNS_NAME)

            try:
                cls.logger.debug('Initializing: %s' % settings.AD_LDAP_URL)
                l = ldap.initialize(settings.AD_LDAP_URL)
                l.protocol_version = ldap.VERSION3
                l.set_option(ldap.OPT_X_TLS_REQUIRE_CERT, ldap.OPT_X_TLS_NEVER)
                cls.logger.debug('Binding user %s' % bind_dn)
                l.simple_bind_s(bind_dn, password)
                result = l.search_ext_s(settings.AD_SEARCH_DN, ldap.SCOPE_SUBTREE,
                                        "sAMAccountName=%s" % username, settings.AD_SEARCH_FIELDS)[0][1]
                email = result.get('mail', (None,))[0]
            except ldap.SERVER_DOWN, ex:
                cls.logger.warning('LDAP-Sever Down (%s)' % ex.message)
                raise PermissionDenied
            except ldap.INVALID_CREDENTIALS:
                cls.logger.warning('LDAP-Server: Rejected login for user %s due to invalid credentials' % username)
                raise PermissionDenied

            cls.logger.debug('User %s was successfully authorized.' % username)

            l.unbind_s()

        except Exception:
            raise PermissionDenied

        try:
            user = User.objects.get(email=email)
            cls.logger.debug('User %s found for email %s ' % (user.username, email))

        except ObjectDoesNotExist, ex:
            cls.logger.debug('User for email %s could not be found.' % email)
            raise PermissionDenied

        return user

整个事情在Apache + uWSGI下运行。当我独立运行 Django(manage.py runserver)时,LDAP 和 LDAPS 一切正常。

但是当使用 LDAPS 在 uWSGI 下运行它时,它总是抛出“Server Down”。LDAP(不带's')有效。使用 tcpdump 我可以看到数据包在 AD 和我的服务器之间双向传输。

uWSGI 如何影响 python-ldap 或底层库与 Active Directory 之间的 LDAPS 通信?

4

2 回答 2

0

默认情况下, uWSGI 在生成其工作人员时会执行一些“聪明”的技巧

uWSGI 尽可能尝试(ab)使用 fork() 调用的 Copy On Write 语义。默认情况下,它会在加载您的应用程序以共享尽可能多的内存后分叉。如果由于某种原因不希望出现这种行为,请使用惰性应用程序选项。这将指示 uWSGI 在每个 worker 的 fork() 之后加载应用程序。

以我的经验,这确实会影响某些库(例如 FreeTDS)。尝试提到的lazy-apps选项。

于 2015-02-27T10:24:58.827 回答
0

通过使用命令行 ldapsearch 上的选项,我和一位同事发现了解决问题的方法 - 但不是首先导致问题的原因。

通过显式设置 HOST 选项,我们让它工作。

在python中它看起来像这样:

l.set_option(ldap.OPT_HOST_NAME, settings.AD_DNS_NAME)
于 2015-02-27T10:43:14.967 回答