有没有办法获取Windows身份验证用户所在的角色列表,而无需通过WindowsPrincipal.IsInRole
方法明确检查?
答案 0 :(得分:37)
WindowsPrincipal.IsInRole
只检查用户是否是具有该名称的组的成员; Windows组是角色。您可以从WindowsIdentity.Groups
属性中获取用户所属组的列表。
您可以从WindowsIdentity
WindowsPrincipal
WindowsIdentity identity = WindowsPrincipal.Identity as WindowsIdentity;
或者您可以从WindowsIdentity上的工厂方法获取它:
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsIdenity.Groups
是IdentityReference
的集合,它只是为您提供了该组的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
。