net mvc5 mvc asp .net asp.net-mvc active-directory

mvc5 - Autorización de formularios ASP.NET MVC con grupos de Active Directory



razor partial (2)

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

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

[Authorize (Roles="SubcontractDB Users")]

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

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

Mi cadena de conexión es:

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

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 determinado grupo en AD.


Así que terminé implementando mi propio atributo de autorización 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<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; } } }

Y luego simplemente puedo usar los siguientes controladores o funciones

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

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

Si desea saber cómo redirigir a otra página basándose en 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


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

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

Luego, en sus controladores o métodos de acción, puede consultar los Grupos de Active Directory así:

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