2

在我的兼職工作(不是IT相關)的Intranet上,我們使用了各種不需要明確登錄的Web應用程序。我們必須顯然登錄到Windows,然後再驗證我們的操作方式。我可以使用用戶Windows登錄自動登錄到Web應用程序嗎?

我在想這是怎麼完成的?不用擔心太多的安全問題,我將如何使用Windows登錄信息來驗證用戶對Web應用程序的身份驗證?我會使用Python(和Django)。

這是如何實現的限制?例如,是否需要特定的瀏覽器?應用程序和Intranet後端必須託管在同一位置還是至少必須進行通信?還是僅僅是獲取用戶的Windows憑據,並將其傳遞給Web應用程序的身份驗證軟件?

+0

您要查找的內容稱爲單點登錄支持。歷史的做法是使用Kerberos;微軟的做法是NTLM。我已經看到了Apache的NTLM模塊,但它看起來非常實驗性,而且維護得不好,所以YMMV。 – 2009-02-01 05:20:18

回答

2

曾幾何時,Internet Explorer支持NTLM身份驗證(類似於基本身份驗證,但它將緩存憑據發送到可以通過域控制器驗證的服務器)。它被用來在內部網中啓用單一登錄,每個人都被期望登錄到域中。我不記得它的細節,我沒有使用它的很長時間。它可能仍然是一個選擇,如果它適合您的需求。

也許有人更熟悉它可能會有更多的細節。

請參見:NTLM Authentication Scheme for HTTP

使用非微軟的服務器架構是要提供必要的服務來說話驗證憑據的最棘手的部分。

+0

您是否認爲.NET Web服務可用於傳遞給Django應用程序的身份驗證? – 2009-02-01 04:09:24

+0

您不妨指向http://modntlm.sourceforge.net/ – 2009-02-01 05:21:21

1

here

-- 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 = "%[email protected]%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 
0

要盡我所知,可自動通過您的登錄憑據唯一的瀏覽器是IE瀏覽器。要啓用此功能,請在安全部分下的高級Internet選項對話框中選擇「啓用集成Windows身份驗證」。這通常是默認啓用的。

Web服務器必須從Web應用程序中刪除匿名用戶權限,並啓用Windows身份驗證選項。只需將您想要訪問Web應用程序的用戶添加到文件/文件夾權限即可。

我只用IIS試過,所以我不確定它是否可以在其他Web服務器上工作。

相關問題