.net windows-identity rbac windows-principal

.net - ¿Cómo puedo recuperar todos los roles(grupos) de los que un usuario es miembro?



install windows admin center (4)

¿Hay alguna forma de obtener una lista de roles en los que se encuentra un usuario autenticado de Windows, sin verificar explícitamente con el método WindowsPrincipal.IsInRole ?


EDITAR: Josh me ganó a eso! :)

Prueba esto

using System; using System.Security.Principal; namespace ConsoleApplication5 { internal class Program { private static void Main(string[] args) { var identity = WindowsIdentity.GetCurrent(); foreach (var groupId in identity.Groups) { var group = groupId.Translate(typeof (NTAccount)); Console.WriteLine(group); } } } }


En un sitio de ASP.NET MVC, puedes hacerlo de la siguiente manera:

Agregue esto a su Web.config:

<system.web> ... <roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" /> ... </system.web>

Luego puede usar Roles.GetRolesForUser() para obtener todos los grupos de Windows de los que el usuario es miembro. Asegúrese de que está using System.Web.Security .


Si no está conectado al servidor de dominio, la función de Translate puede generar la siguiente excepción. The trust relationship between this workstation and the primary domain failed.

Pero para la mayoría de los grupos, estará bien, así que uso:

foreach(var s in WindowsIdentity.GetCurrent().Groups) { try { IdentityReference grp = s.Translate(typeof (NTAccount)); groups.Add(grp.Value); } catch(Exception) { } }


WindowsPrincipal.IsInRole solo comprueba si el usuario es miembro del grupo con ese nombre; Un grupo de Windows es un rol. Puede obtener una lista de los grupos de los que un usuario es miembro desde la propiedad WindowsIdentity.Groups .

Puede obtener WindowsIdentity desde su WindowsPrincipal :

WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;

o puede obtenerlo de un método de fábrica en WindowsIdentity:

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsIdenity.Groups es una colección de IdentityReference que solo le da el SID del grupo. Si necesita los nombres de los grupos, deberá traducir la IdentityReference a una cuenta NTAccount y obtener el valor:

var groupNames = from id in identity.Groups select id.Translate(typeof(NTAccount)).Value;