ASP .NET MVC Forma la autorización con grupos de Active Directory

Estoy intentando autenticar usando usuarios y grupos en ASP.NET MVC contra Active Directory.

He puesto el siguiente atributo en todas mis clases (excepto en la clase de cuenta):

[Authorize (Roles="SubcontractDB Users")] 

Este grupo se encuentra en OU = Área-> OU = Grupos-> OU = Compañía-> CN = SubcontratarDB en el directorio activo. Asumo que también necesito configurar un RoleManager en web.config que he intentado hacer de la siguiente manera:

       

Mi cadena de conexión es:

   

Obviamente lo estoy haciendo mal ya que esto no funciona. Todo lo que quiero hacer es permitir el acceso a los usuarios que son miembros de un cierto grupo en AD.

Ya no es necesario implementar su propio atributo para esta funcionalidad en ASP.NET MVC 3. AspNetWindowsTokenRoleProvider funciona con usuarios y grupos de Active Directory. Para usar esto con AuthorizeAttribute , debe agregar lo siguiente a su web.config:

        

Luego, en sus controladores o métodos de acción, puede referirse a Grupos de Active Directory como sigue:

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

Así que terminé implementando mi propio atributo authorize y usando eso:

 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(); // 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; } } } 

Y luego simplemente puedo usar los siguientes controladores o funciones anteriores

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

NB: Simplemente podría usar el new PrincipalContext(ContextType.Domain); sin embargo, hay un error en .NET 4.0 que arroja un error (0x80005000) en userPrincpal.IsMemberOf(...) . Mira aquí para más detalles.

Si desea saber cómo redirigir a otra página en función de una autorización fallida, consulte mi respuesta aquí: Agregar un mensaje de error al modelo de vista basado en el atributo del controlador en ASP.NET MVC