27

有没有办法在不通过方法明确检查的情况下获取 Windows 身份验证用户所在的角色列表WindowsPrincipal.IsInRole

4

4 回答 4

48

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

你可以WindowsIdentity从你的WindowsPrincipal

WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;

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

WindowsIdentity identity = WindowsIdentity.GetCurrent();

WindowsIdenity.Groups是一个集合,IdentityReference它只为您提供组的 SID。如果您需要组名,则需要将其转换IdentityReference为 anNTAccount并获取值:

var groupNames = from id in identity.Groups
                 select id.Translate(typeof(NTAccount)).Value;
于 2009-04-17T21:39:56.530 回答
9

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

试试这个

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);
            }
        }
    }
}
于 2009-04-17T21:41:53.873 回答
7

如果没有连接到域服务器,该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) {  }
}
于 2014-05-14T14:17:19.370 回答
1

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

将此添加到您的 Web.config:

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

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

于 2017-09-15T14:20:00.913 回答