Como posso recuperar todas as funções (grupos) um usuário é membro de?
-
11-09-2019 - |
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
?
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
.