2

Sur l'intranet de mon travail à temps partiel (non lié à l'informatique), il existe différentes applications Web que nous utilisons et qui ne nécessitent pas de connexion explicite. Nous sommes obligés de nous connecter à Windows de toute évidence, et cela nous authentifie alors comment.Puis-je me connecter automatiquement à une application Web à l'aide d'une ouverture de session Windows?

Je me demande comment cela est fait? Sans trop me soucier de la sécurité, comment procéder pour authentifier un utilisateur sur une application web, en utilisant les informations de connexion de Windows? J'utiliserais Python (et Django).

Y a-t-il des limites à la façon dont cela peut être réalisé? Par exemple, un navigateur spécifique serait-il nécessaire? Le backend de l'application et de l'intranet doit-il être hébergé au même endroit ou au moins doit-il communiquer? Ou est-ce simplement obtenir les informations d'identification Windows des utilisateurs et les transmettre au logiciel d'authentification de l'application Web?

+0

Ce que vous cherchez est appelé support de connexion unique. La façon historique de le faire était d'utiliser Kerberos; L'approche de Microsoft est NTLM. J'ai vu un module NTLM pour Apache, mais il semblait très expérimental et pas bien entretenu, donc YMMV. –

Répondre

2

Il était une fois l'authentification NTLM prise en charge par Internet Explorer (similaire à l'authentification de base, mais elle envoyait au serveur des informations d'identification mises en cache pouvant être vérifiées avec le contrôleur de domaine). Il était utilisé pour activer le code unique dans un intranet où tout le monde était censé être connecté au domaine. Je ne me souviens pas des détails et je ne l'ai pas utilisé depuis longtemps. Cela peut toujours être une option si cela correspond à vos besoins.

Peut-être que quelqu'un de plus familier avec cela peut avoir plus de détails.

Voir: NTLM Authentication Scheme for HTTP

La partie la plus délicate de l'utilisation du cadre serveur non Microsoft va parler avec les services nécessaires pour vérifier les informations d'identification.

+0

Pensez-vous qu'un service Web .NET pourrait être utilisé pour l'authentification transmise à l'application Django? –

+0

Vous pouvez pointer vers http://modntlm.sourceforge.net/ –

1

De 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

Je crois que la question est liée à la prise en charge du Single Sign On, pas simplement une authentification AD. –

0

Au meilleur de ma connaissance le seul navigateur qui passe automatiquement vos identifiants de connexion est Internet Explorer. Pour activer cette fonctionnalité, sélectionnez "Activer l'authentification Windows intégrée" dans la boîte de dialogue Options Internet avancées de la section Sécurité. Ceci est généralement activé par défaut.

Le serveur Web devra avoir l'autorisation utilisateur anonyme supprimée de l'application Web et activer l'option d'authentification Windows cochée. Ajoutez simplement les utilisateurs auxquels vous souhaitez accéder à l'application Web aux autorisations de fichier/dossier.

J'ai seulement essayé ceci avec IIS ainsi je ne suis pas sûr si cela fonctionnera sur d'autres serveurs de Web.

Questions connexes