2010-12-03 4 views
25

Je tente d'authentifier l'utilisation d'utilisateurs et de groupes dans ASP.NET MVC par rapport à Active Directory.Autorisation de formulaires ASP .NET MVC avec des groupes Active Directory

J'ai mis l'attribut suivant sur toutes mes classes (à l'exception de la classe de compte):

[Authorize (Roles="SubcontractDB Users")] 

Ce groupe se trouve sous OU = Area-> OU = Groupes-> OU = Company-> CN = SubcontractDB dans le répertoire actif. Je suppose que je dois aussi installer un roleManager dans web.config que j'ai essayé de faire comme suit:

<roleManager defaultProvider="ADRoleProvider"> 
    <providers> 
    <clear /> 
     <add name="ADMembershipProvider" 
      type="System.Web.Security.ActiveDirectoryMembershipProvider" 
      connectionStringName="ADConnectionString" 
      attributeMapUsername="sAMAccountName" /> 
    </providers> 
</roleManager> 

Ma chaîne de connexion est:

<add name="ADConnectionString" 
     connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/> 

Il est évident que je fais faux car cela ne fonctionne pas. Tout ce que je veux faire est de permettre l'accès aux utilisateurs qui sont membres d'un certain groupe dans AD.

+0

Est il existe un moyen d'éviter d'être demandé des informations d'identification lors de l'utilisation autoriser? J'utilise Windows auth sur un site intranet et j'ai besoin de sécuriser par groupe AD et ne pas inviter l'utilisateur pour les informations d'identification. – Fireworks

Répondre

29

donc j'ai fini par mettre en œuvre ma propre authorize attribut et en utilisant que:

namespace Application.Filters 
{ 
    public class AuthorizeADAttribute : AuthorizeAttribute 
    { 
     public string Groups { get; set; } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
     if (base.AuthorizeCore(httpContext)) 
     { 
      /* Return true immediately if the authorization is not 
      locked down to any particular AD group */ 
      if (String.IsNullOrEmpty(Groups)) 
       return true; 

      // Get the AD groups 
      var groups = Groups.Split(',').ToList<string>(); 

      // Verify that the user is in the given AD group (if any) 
      var context = new PrincipalContext(ContextType.Domain, "server"); 
      var userPrincipal = UserPrincipal.FindByIdentity(context, 
               IdentityType.SamAccountName, 
               httpContext.User.Identity.Name); 

      foreach (var group in groups) 
       if (userPrincipal.IsMemberOf(context, IdentityType.Name, group)) 
        return true; 
     } 
     return false; 
     } 
    } 
} 

Et je peux simplement utiliser les contrôleurs ci-dessus ou fonctions suivantes

Using Application.Filters; 
... 
[AuthorizeAD(Groups = "groupname")] 

NB: Vous pouvez simplement utilisez new PrincipalContext(ContextType.Domain); mais il existe un bogue dans .NET 4.0 qui génère une erreur (0x80005000) à userPrincpal.IsMemberOf(...). Voir here pour plus de détails.

Si vous voulez savoir comment rediriger vers une autre page basée sur l'autorisation a échoué, vérifiez ma réponse ici: Adding an error message to the view model based on controller attribute in ASP.NET MVC

+0

J'aime ce que vous avez fait ici, sauf que vous vous fiez à un simple cookie pour cacher le fait que quelqu'un a été autorisé. Qu'est-ce qui m'empêche d'ajouter un cookie authUserGroups manuellement et de contourner une vérification AD initiale? – Tr1stan

+0

Bon point, section cookie supprimée. – link664

+0

C'est la mauvaise façon de le faire. Voir mon article sur MSDN Comment créer un site intranet à l'aide d'ASP.NET MVC msdn.microsoft.com/en-us/library/gg703322(VS.98).aspx Vous devez utiliser la classe AspNetWindowsTokenRoleProvider – RickAndMSFT

31

Il est plus nécessaire de mettre en œuvre votre propre attribut pour cette fonctionnalité dans ASP.NET MVC 3. Le AspNetWindowsTokenRoleProvider fonctionne avec les utilisateurs et les groupes Active Directory. Pour utiliser ceci avec AuthorizeAttribute vous devez ajouter ce qui suit à votre web.config:

<authentication mode="Windows" /> 

<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider"> 
    <providers> 
     <clear /> 
     <add 
      name="AspNetWindowsTokenRoleProvider" 
      type="System.Web.Security.WindowsTokenRoleProvider" 
      applicationName="/" /> 
    </providers> 
</roleManager> 

Ensuite, sur vos contrôleurs ou des méthodes d'action, vous pouvez vous référer aux groupes Active Directory comme ceci:

[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")] 
+3

Est-ce que cela fonctionne lors de l'utilisation de l'authentification par formulaires ou uniquement lors de l'utilisation de l'authentification Windows? – link664

+2

Je crois que la réponse à ma question est non: http://stackoverflow.com/questions/2610377/how-can-i-provide-an-asp-net-forms-authentication-ux-while-using-active-directory/2634718 # 2634718 – link664

+0

Cela ne fonctionne absolument pas, pas pour les groupes AD, pas pour les rôles, seulement pour les utilisateurs (utilisateurs AD) seulement 'Users =" DOMAIN \\ Username "' fonctionne. Je ne comprends pas pourquoi 'Roles =" DOMAIN \\ Group "' ne fonctionne pas du tout pour moi. –

Questions connexes