Ntlm / Kerberos аутентификация в Джанго - PullRequest
13 голосов
/ 04 августа 2010

Я ищу руководство по добавлению поддержки аутентификации Windows в приложение django, в частности OSQA

Мне известно о http://code.google.com/p/python-ntlm/ И также видел этот пост: http://erny -rev.blogspot.com / 2007/11 / ntlm-authentication-in-django.html Но я не Django-dev, я просто хочу развернуть OSQA в среде Windows (Интранет, поэтому мне нужно добавить проверку подлинности Windows).Поэтому я ищу простое пошаговое описание.

(мне удалось развернуть сайт OSQA в Windows с SQL Server, и он работает)

ОБНОВЛЕНИЕ:
Я хотел бы получить не только аутентификацию против AD, но SSO-подобное поведение в IE.Когда пользователь получал доступ к моему сайту на основе django в IE, он автоматически проходил аутентификацию с помощью учетной записи домена.

Ответы [ 3 ]

12 голосов
/ 24 сентября 2010

Вы можете сделать это с помощью аутентификации Apache, mod_auth_kerb и REMOTE_USER с Django, размещенным как mod_wsgi.

Вот пример некоторых конфигураций, которые мы используем:

WSGIDaemonProcess myapp user=myapp group=myapp processes=5 threads=1
WSGIProcessGroup myapp
WSGIScriptAlias /myapp /home/wolapp/code/wolapp.wsgi
<VirtualHost ...>
    <Location /myapp>
            AuthType                Kerberos
            AuthName                "Domain Login"
            KrbMethodNegotiate      On
            KrbMethodK5Passwd       On
            KrbAuthRealms           YOUR.DOMAIN
            Krb5Keytab              /etc/krb5.keytab
            KrbServiceName          HTTP/server.your.domain
            require                 valid-user
    </Location>
</VirtualHost>

Затем вам нужно настроить это:

http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

Несколько замечаний:

  1. Опера полностью провалилась в нашем тестировании; он не может обработать заголовок "Переговоры"
  2. IE работает нормально, если машина находится в домене, но если это не так, у вас дважды запрашивают пароль - в первый раз машина использует «ITSNAME \ username», что не удается; второй раз голое "имя пользователя"

Надеюсь, это поможет.

6 голосов
/ 20 декабря 2012

Возможно, это не так уж и элегантно, но работает (импорт / отображение в представлениях):

import base64


def get_msg_str(msg,start):
    msg_len, _, msg_off = struct.unpack("<HHH", msg[start:start + 6])
    return msg[msg_off:msg_off + msg_len].replace("\0", '')


def ntlm_auth(request):
    """Goes through ntlm stages...
    Return user_name, response.
    While response is not none, keep sending it.
    Then use the user.
    """
    username = None
    response = None

    auth = request.META.get('HTTP_AUTHORIZATION')
    if not auth:
        response = HttpResponse(status=401)
        response['WWW-Authenticate'] = "NTLM"
    elif auth[:4] == "NTLM":
        msg = base64.b64decode(auth[4:])
        #  print repr(msg)
        ntlm_fmt = "<8sb" #string, length 8, 4 - op
        NLTM_SIG = "NTLMSSP\0"
        signature, op = struct.unpack(ntlm_fmt, msg[:9])
        if signature != NLTM_SIG:
            print "error header not recognized"
        else:
            print "recognized"
            # print signature, op
            # print repr(msg)
            if op == 1:
                out_msg_fmt = ntlm_fmt + "2I4B2Q2H"
                out_msg = struct.pack(out_msg_fmt,
                    NLTM_SIG, #Signature
                    2, #Op
                    0, #target name len
                    0, #target len off
                    1, 2, 0x81, 1, #flags
                    0, #challenge
                    0, #context
                    0, #target info len
                    0x30, #target info offset
                )

                response = HttpResponse(status=401)
                response['WWW-Authenticate'] = "NTLM " + base64.b64encode(out_msg).strip()
            elif op == 3:
                username = get_msg_str(msg, 36)

    return username, response

Использование:

def my_view(request):
    username, response = ntlm_auth(request)
    if response:
        return response

Я уверен, что это можно сделать более элегантно, как декоратор, и могут быть другие способы - но я использовал это, и это работает.

5 голосов
/ 04 августа 2010

Как правило, если вы просто хотите аутентификацию по Active Directory, наиболее вероятным подходом будет использование аутентификации LDAP по службе LDAP Active Directory. Единственная хитрость в том, что в отличие от большинства серверов LDAP, Active Directory должен иметь аутентифицированного пользователя (и пароль). Большинство людей заканчивают тем, что устанавливают пользователя 'ldap-query' с жестким кодом этого пользователя для конфигурации запроса.

Например, см. http://djangosnippets.org/snippets/501/ и http://www.google.com/search?q=Django+LDAP+authentication

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...