Pregunta

¿Hay una manera de obtener una lista de papeles un usuario de Windows autenticado se encuentra, sin comprobar de forma explícita por el método WindowsPrincipal.IsInRole?

¿Fue útil?

Solución

WindowsPrincipal.IsInRole simplemente comprueba si el usuario es un miembro del grupo con ese nombre; un grupo de Windows es un Papel. Usted puede obtener una lista de los grupos que un usuario es miembro de la propiedad de WindowsIdentity.Groups.

Puede obtener WindowsIdentity de su WindowsPrincipal:

WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;

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

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsIdenity.Groups es una colección de IdentityReference la que sólo te da el SID del grupo. Si necesita los nombres de los grupos tendrá que traducir el IdentityReference en un NTAccount y obtener el valor:

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

Otros consejos

EDIT: Josh me ganó de mano! :)

Probar

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

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

Sin embargo, para la mayoría de los grupos, que 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) {  }
}

En un sitio ASP.NET MVC, puede hacerlo de esta manera:

Agregue esto a su Web.config:

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

A continuación, puede utilizar Roles.GetRolesForUser() para obtener todos los grupos de Windows que el usuario es miembro de. Asegúrese de que está using System.Web.Security.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top