如何检索用户所属的所有角色(组)?

时间:2009-04-17 21:18:04

标签: .net windows-identity rbac windows-principal

有没有办法获取Windows身份验证用户所在的角色列表,而无需通过WindowsPrincipal.IsInRole方法明确检查?

4 个答案:

答案 0 :(得分:37)

WindowsPrincipal.IsInRole只检查用户是否是具有该名称的组的成员; Windows组角色。您可以从WindowsIdentity.Groups属性中获取用户所属组的列表。

您可以从WindowsIdentity

获取WindowsPrincipal
WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;

或者您可以从WindowsIdentity上的工厂方法获取它:

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsIdenity.GroupsIdentityReference的集合,它只是为您提供了该组的SID。如果您需要群组名称,则需要将IdentityReference翻译为NTAccount并获取值:

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

答案 1 :(得分:8)

编辑:乔希打败了我! :)

试试这个

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

答案 2 :(得分:6)

如果您未连接到域服务器,Translate函数可能会抛出以下异常The trust relationship between this workstation and the primary domain failed.

但是对于大多数人来说,没关系,所以我使用:

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

答案 3 :(得分:0)

在ASP.NET MVC站点中,您可以这样做:

将此添加到您的Web.config:

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

然后,您可以使用Roles.GetRolesForUser()获取该用户所属的所有Windows组。确保您using System.Web.Security