Проблемы с LDAP-логином при использовании в Python - PullRequest
0 голосов
/ 24 октября 2019

Я использую flask_ldap3_login для входа через аутентификацию из Active Directory. Код приведен ниже для справки.

from flask import Flask, url_for
from flask_ldap3_login import LDAP3LoginManager, AuthenticationResponseStatus
from flask_login import LoginManager, login_user, UserMixin, current_user
from flask import render_template_string, redirect
from flask_ldap3_login.forms import LDAPLoginForm

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
app.config['DEBUG'] = True

# Setup LDAP Configuration Variables. Change these to your own settings.
# All configuration directives can be found in the documentation.

# Hostname of your LDAP Server
app.config['LDAP_HOST'] = 'ldap://x.x.x.x'

# Base DN of your directory 
app.config['LDAP_BASE_DN'] = 'OU=City Name,OU=Team Name,OU=Users,OU=Country,OU=Sites,DC=domain,DC=com'
# app.config['LDAP_BASE_DN'] = 'DC=domain,DC=com'

# Users DN to be prepended to the Base DN
# app.config['LDAP_USER_DN'] = 'OU=Users,OU=Country'

# Groups DN to be prepended to the Base DN
# app.config['LDAP_GROUP_DN'] = 'OU=City,OU=Team Name'

# The RDN attribute for your user schema on LDAP
# app.config['LDAP_USER_RDN_ATTR'] = 'cn'

# The Attribute you want users to authenticate to LDAP with.
app.config['LDAP_USER_LOGIN_ATTR'] = 'sAMAccountName'

# The Username to bind to LDAP with
app.config['LDAP_BIND_USER_DN'] = 'CN=Name,OU=city,OU=Team,OU=Users,OU=country,OU=Sites,DC=domain,DC=com'

# The Password to bind to LDAP with
app.config['LDAP_BIND_USER_PASSWORD'] = 'password'

login_manager = LoginManager(app)              # Setup a Flask-Login Manager
ldap_manager = LDAP3LoginManager(app)          # Setup a LDAP3 Login Manager.

@app.route('/manual_login', methods=['POST'])
def manual_login():
      result = app.ldap3_login_manager.authenticate('user`enter code here`', 'password')
    print(result.status)
    return 'fail' if result.status == AuthenticationResponseStatus.fail else 'success'

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0")

Тогда возникает проблема, когда я использую полный app.config ['LDAP_BASE_DN'] , как упомянуто выше, тогда он работает нормально, но в случаекогда я использую только DC = домен, DC = com в качестве Base_DN для аутентификации пользователей из всей организации, а затем возвращаю мне fail вместо Success

1 Ответ

0 голосов
/ 25 октября 2019

Вам необходимо установить область действия на SUBTREE:

app.config['LDAP_USER_SEARCH_SCOPE'] = 'SUBTREE'

По умолчанию LEVEL в ldap3 (см. документация - кажется, что реализация flask-ldap3 не упоминает об этомхотя):

  • BASE: извлекает атрибуты записи, указанной в базе поиска.
  • LEVEL: извлекает атрибуты записей, содержащихся в базе поиска. База должна ссылаться на объект контейнера.
  • SUBTREE: извлекает атрибуты записей, указанных в search_base, и всех подчиненных контейнеров в нисходящем направлении.

Для тех, у кого проблема остается, даже после правильной установки LDAP_USER_SEARCH_SCOPE, вам нужно установить для LDAP_ALWAYS_SEARCH_BIND непустое значение (#undocumented):

app.config['LDAP_ALWAYS_SEARCH_BIND'] = 1

в противном случае ldap3 сделает предположение, что "Поскольку RDN пользователя совпадает споле логина, оно может выполнять прямую привязку. ", которая будет работать, только если RDN пользователя на 1 LEVEL вниз по <user-base-dn>,<base-dn>, но не дальше в SUBTREE.

...