Pergunta

Existe uma maneira de obter uma lista de funções de um utilizador autenticado do Windows está em, sem verificar explicitamente pelo método WindowsPrincipal.IsInRole?

Foi útil?

Solução

WindowsPrincipal.IsInRole verifica apenas se o usuário é um membro do grupo com esse nome; um grupo do Windows é um Papel. Você pode obter uma lista dos grupos que um usuário é membro de da propriedade WindowsIdentity.Groups.

Você pode obter WindowsIdentity do seu WindowsPrincipal:

WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;

ou você pode obtê-lo a partir de um método de fábrica em WindowsIdentity:

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsIdenity.Groups é uma coleção de IdentityReference que apenas lhe dá o SID do grupo. Se você precisar os nomes dos grupos terá de traduzir o IdentityReference em um NTAccount e obter o valor:

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

Outras dicas

EDIT: Josh chegou antes de mim! :)

Tente este

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

Se você não estiver conectado ao servidor de domínio, a função Translate pode lançar o seguinte The trust relationship between this workstation and the primary domain failed. exceção

Mas para a maioria dos grupos, será OK, então eu uso:

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

Em um site ASP.NET MVC, você pode fazê-lo como este:

Adicione isto a sua Web.config:

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

Então você pode usar Roles.GetRolesForUser() para obter todos os grupos do Windows que o usuário é um membro de. Verifique se você está using System.Web.Security.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top