3

私のアルバイトのイントラネット (IT 関連ではない) には、明示的にログインする必要のないさまざまな Web アプリケーションが使用されています。明らかに Windows にログインする必要があり、それによって何らかの方法で認証されます。

私はこれがどのように行われるのだろうか?セキュリティをあまり気にせずに、Windows ログイン情報を利用して Web アプリケーションに対してユーザーを認証するにはどうすればよいでしょうか? 私はPython(およびDjango)を使用していました。

これを達成する方法に制限はありますか? たとえば、特定のブラウザが必要ですか? アプリケーションとイントラネット バックエンドを同じ場所でホストする必要がありますか、それとも少なくとも通信する必要がありますか? それとも、単にユーザーの Windows 資格情報を取得し、それを Web アプリケーションの認証ソフトウェアに渡すだけですか?

4

3 に答える 3

2

昔々、Internet ExplorerはNTLM認証をサポートしていました(基本認証に似ていますが、ドメインコントローラーで検証できるキャッシュされた資格情報をサーバーに送信しました)。これは、全員がドメインにログインすることが期待されるイントラネット内でシングルサインオンを有効にするために使用されました。私はそれの詳細を思い出せません、そして私はそれを何年もの間使用していません。それがあなたのニーズに合うならば、それはまだオプションかもしれません。

多分それをもっとよく知っている誰かがより多くの詳細を持っているかもしれません。

参照: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

私の知る限り、ログイン資格情報を自動的に渡すブラウザはInternetExplorerだけです。この機能を有効にするには、[セキュリティ]セクションの[高度なインターネットオプション]ダイアログで[統合Windows認証を有効にする]を選択します。これは通常、デフォルトで有効になっています。

Webサーバーでは、匿名ユーザーのアクセス許可をWebアプリケーションから削除し、Windows認証オプションを有効にする必要があります。Webアプリケーションにアクセスするユーザーをファイル/フォルダーのアクセス許可に追加するだけです。

私はIISでこれを試しただけなので、他のWebサーバーで機能するかどうかはわかりません。

于 2009-02-01T05:15:19.010 に答える