3

在我的兼职工作(与 IT 无关)的 Intranet 上,我们使用了各种不需要显式登录的 Web 应用程序。显然,我们需要登录到 Windows,然后以某种方式对我们进行身份验证。

我想知道这是怎么做到的?无需过多担心安全性,我将如何使用 Windows 登录信息对 Web 应用程序的用户进行身份验证?我会使用 Python(和 Django)。

对如何实现这一点有限制吗?例如,是否需要特定的浏览器?应用程序和 Intranet 后端是否必须托管在同一位置或至少必须进行通信?还是只是简单地获取用户的 Windows 凭据,并将其传递给 Web 应用程序的身份验证软件?

4

3 回答 3

2

曾几何时,Internet Explorer 支持 NTLM 身份验证(类似于基本身份验证,但它将缓存的凭据发送到服务器,可以通过域控制器进行验证)。它用于在希望每个人都登录到域的 Intranet 中启用单点登录。我不记得它的细节,而且我已经很久没有使用它了。如果它符合您的需求,它可能仍然是一种选择。

也许更熟悉它的人可能有更多细节。

请参阅:HTTP 的 NTLM 身份验证方案

使用非微软服务器框架的棘手部分是与必要的服务进行对话以验证凭据。

于 2009-02-01T03:50:06.123 回答
1

这里

-- Added to settings.py --

### ACTIVE DIRECTORY SETTINGS

# AD_DNS_NAME should set to the AD DNS name of the domain (ie; example.com)  
# If you are not using the AD server as your DNS, it can also be set to 
# FQDN or IP of the AD server.

AD_DNS_NAME = 'example.com'
AD_LDAP_PORT = 389

AD_SEARCH_DN = 'CN=Users,dc=example,dc=com'

# This is the NT4/Samba domain name
AD_NT4_DOMAIN = 'EXAMPLE'

AD_SEARCH_FIELDS = ['mail','givenName','sn','sAMAccountName']

AD_LDAP_URL = 'ldap://%s:%s' % (AD_DNS_NAME,AD_LDAP_PORT)


-- In the auth.py file --

from django.contrib.auth.models import User
from django.conf import settings
import ldap

class ActiveDirectoryBackend:

  def authenticate(self,username=None,password=None):
    if not self.is_valid(username,password):
      return None
    try:
      user = User.objects.get(username=username)
    except User.DoesNotExist:
      l = ldap.initialize(settings.AD_LDAP_URL)
      l.simple_bind_s(username,password)
      result = l.search_ext_s(settings.AD_SEARCH_DN,ldap.SCOPE_SUBTREE, 
               "sAMAccountName=%s" % username,settings.AD_SEARCH_FIELDS)[0][1]
      l.unbind_s()

      # givenName == First Name
      if result.has_key('givenName'):
        first_name = result['givenName'][0]
      else:
        first_name = None

      # sn == Last Name (Surname)
      if result.has_key('sn'):
        last_name = result['sn'][0]
      else:
        last_name = None

      # mail == Email Address
      if result.has_key('mail'):
        email = result['mail'][0]
      else:
        email = None

      user = User(username=username,first_name=first_name,last_name=last_name,email=email)
      user.is_staff = False
      user.is_superuser = False
      user.set_password(password)
      user.save()
    return user

  def get_user(self,user_id):
    try:
      return User.objects.get(pk=user_id)
    except User.DoesNotExist:
      return None

  def is_valid (self,username=None,password=None):
    ## Disallowing null or blank string as password
    ## as per comment: http://www.djangosnippets.org/snippets/501/#c868
    if password == None or password == '':
      return False
    binddn = "%s@%s" % (username,settings.AD_NT4_DOMAIN)
    try:
      l = ldap.initialize(settings.AD_LDAP_URL)
      l.simple_bind_s(binddn,password)
      l.unbind_s()
      return True
    except ldap.LDAPError:
      return False
于 2009-02-01T04:20:08.450 回答
0

据我所知,唯一能自动传递您的登录凭据的浏览器是 Internet Explorer。要启用此功能,请在安全部分下的高级 Internet 选项对话框中选择“启用集成 Windows 身份验证”。这通常默认启用。

Web 服务器必须从 Web 应用程序中删除匿名用户权限并选中启用 Windows 身份验证选项。只需将您想要访问 Web 应用程序的用户添加到文件/文件夹权限即可。

我只在 IIS 上尝试过,所以我不确定它是否可以在其他 Web 服务器上运行。

于 2009-02-01T05:15:19.010 回答