【问题标题】:Ntlm/Kerberos authentication in DjangoDjango 中的 Ntlm/Kerberos 身份验证
【发布时间】:2011-03-25 00:15:19
【问题描述】:

我正在寻找有关将 Windows 身份验证支持添加到 django 应用程序的指南,特别是 OSQA

我知道http://code.google.com/p/python-ntlm/ 也看到了这个帖子:http://erny-rev.blogspot.com/2007/11/ntlm-authentication-in-django.html 但我不是 Django-dev,我只是想在 Windows 环境(内网,所以我需要添加 Windows 身份验证)中部署 OSQA。所以我正在寻找简单的分步说明。

(我已经设法在带有 SQL Server 的 Windows 上部署了一个 OSQA 站点并且它正在运行)

更新:
我不仅想获得针对 AD 的身份验证,还想在 IE 中获得类似 SSO 的行为。当用户在 IE 中访问我基于 django 的站点时,它会自动使用其域帐户进行身份验证。

【问题讨论】:

标签: django windows-authentication


【解决方案1】:

您可以使用 Apache、mod_auth_kerb 和 REMOTE_USER 身份验证以及托管为 mod_wsgi 的 Django 来执行此操作。

这是我们使用的一些配置的示例:

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. Opera 在我们的测试中完全失败;它无法处理“协商”标题
  2. 如果机器在域中,IE 可以正常工作,但如果不在域中,则会提示您两次输入密码 - 第一次机器使用“ITSNAME\username”失败;第二次是裸“用户名”

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这可能不是那么优雅,但它可以工作(导入/放入视图):

    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
    

    我相信这可以作为装饰器变得更加优雅,并且可能还有其他方法 - 但我已经使用它并且它有效。

    【讨论】:

    • 实际的身份验证在哪里发生?看起来它只是接受浏览器响应(可能被欺骗?)。
    • 这是真的 - 在我们的用例中,我们实际上不是面向 Web 的,这主要是因为小型团队可以更懒惰地使用 IE SSO 输入用户名。但是,我怀疑还有更多带有更多凭据信息的消息数据可以检查 Django 用户数据库。随时改进我的答案。
    • 我正在尝试使用这个例子,但我不能让它工作。它在“not auth”下发送初始响应,但之后什么也没有。是否有一些关于制作这项工作的细节我遗漏了?
    • 它永远不会进入第二阶段?浏览器客户端是否发送回带有 NTLM 身份验证的数据包?我建议使用wireshark 看看发生了什么......
    【解决方案3】:

    通常,如果您只想针对 Active Directory 进行身份验证,最有可能成功的方法是针对 Active Directory LDAP 服务使用 LDAP 身份验证。唯一的技巧是,与大多数 LDAP 服务器不同,Active Directory 需要经过身份验证的用户(和密码)。大多数人最终会建立一个“ldap-query”用户并使用该用户进行硬编码以进行查询配置。

    例如,请参阅http://djangosnippets.org/snippets/501/http://www.google.com/search?q=Django+LDAP+authentication

    【讨论】:

    • 我不仅想获得针对 AD 的身份验证,还想在 IE 中获得类似 SSO 的行为。当用户在 IE 中访问我基于 django 的站点时,它会自动使用其域帐户进行身份验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2013-08-01
    • 2011-11-10
    • 2011-08-07
    • 2011-10-08
    • 2015-06-22
    相关资源
    最近更新 更多