2010-11-30 27 views
3

J'ai une application où j'affiche chaque groupe Active Directory auquel appartient l'utilisateur actuel. Lorsque j'ai ma configuration de configuration comme ceci:Quand l'authentification ASP.NET se produit-elle?

<authentication mode="Windows"/> 
    <authorization> 
     <deny users="?"/> 
     <allow users="*"/> 
    </authorization> 

Cela fonctionne très bien. Quand il est comme ceci:

<authentication mode="Windows"/> 
    <authorization> 
     <!--<deny users="?"/>--> 
     <allow users="*"/> 
    </authorization> 

Aucun groupe n'est trouvé. Pourquoi cela fait-il une différence? Est-ce que asp.net ne s'authentifie que si nous refusons spécifiquement l'accès à des utilisateurs non authentifiés?

Si elle aide c'est ainsi que je reçois les groupes:

protected string GetUserGroups() 
    { 
     StringBuilder userGroups = new StringBuilder(); 
     ArrayList groupMembers = new ArrayList(); 
     DirectoryEntry root = new DirectoryEntry("LDAP://myldap/DC=nc,DC=local"); 
     DirectorySearcher ds = new DirectorySearcher(root); 
     ds.Filter = String.Format("(&(samaccountname={0})(objectClass=person))", User.Identity.Name.Substring(User.Identity.Name.LastIndexOf(@"\") + 1)); 
     ds.PropertiesToLoad.Add("memberof"); 
     try 
     { 
      foreach (SearchResult sr in ds.FindAll()) 
      { 
       foreach (string str in sr.Properties["memberof"]) 
       { 
        string str2 = str.Substring(str.IndexOf("=") + 1, str.IndexOf(",") - str.IndexOf("=") - 1); 
        groupMembers.Add(str2); 
       } 
      } 
     } 
     catch 
     { 
      //ignore if any properties found in AD 
     } 
     return String.Join("|", (string[])groupMembers.ToArray(typeof(string))); 
    } 
+1

Bien que je ne puisse pas confirmer ou infirmer, il semblerait raisonnable d'optimiser l'authentification des utilisateurs lorsqu'aucune authentification n'est nécessaire. – Lazarus

+0

Est-ce que User.Identity.Name a une valeur en cas d'échec? – Zachary

+0

Asp.net ne nécessite pas d'authentification si vous autorisez l'accès anonyme. Vraiment, pourquoi dois-je envoyer mon nom d'utilisateur si un autre utilisateur ne le fait pas? Est-il meilleur que moi? Vous pouvez mettre un point d'arrêt dans le cas de global.asax pour vous assurer de cela. – vorrtex

Répondre

3

Je peux me tromper, mais je crois que c'est comment cela fonctionne:

La première fois qu'un navigateur frappe un site il le fait comme anonyme.

Si le serveur indique que l'anonymat n'est pas autorisé, le navigateur envoie alors les informations d'identification Windows aux utilisateurs.

Si ces informations d'identification ne sont pas satisfaites, le navigateur ouvre la boîte de connexion ou (en fonction de l'application) les envoie à une page de connexion. Donc, parce que votre site autorise l'anonymat, tous les utilisateurs viennent de cette façon.

+0

Savez-vous s'il est possible de forcer le navigateur à envoyer les informations d'identification de la fenêtre des utilisateurs? –

+1

@Abe: Désactiver l'accès anonyme via les paramètres IIS. Utilisez simplement le gestionnaire IIS. Il devrait être sous authentification (IIS 7). Il suffit de désactiver "Authentification anonyme" et d'activer "Authentification de base" qui devrait lancer le défi de connexion. IE enverra ces informations d'identification automatiquement pour le premier test. Je ne suis pas sûr des autres navigateurs. – NotMe

+0

Génial, je vais vérifier ça. –