Active Directory组成员在.NET 4.5检查(Active Directory Gr

2019-07-03 10:54发布

我使用Windows身份验证的ASP.Net MVC应用程序,我检查组成员对控制器操作的安全性。

简单,因为它的声音,我发现可以解决我遇到的问题没有其他问题。

第一尝试:[授权]

经典的方法是简单地拍一个Authorize的控制器操作数据注解属性和去镇:

[Authorize(Roles = @"domain\groupName1")]

没有骰子。 提示我输入凭据。 通常,这意味着什么是错的与Windows身份验证的配置,但它是建立罚款:(1) HttpContext.User是一个WindowsPrincipal对象,和(2)我证实了另一种已知的组名的作品。

第二次尝试:IsInRole()

采取下一步是去一个更老式的路线和使用IPrincipal.IsInRole()并再次,一个返回false ,其他的true

var wp = (WindowsPrincipal)User;

// false
var inGroup1 = wp.IsInRole(@"domain\groupName1");
// true
var inGroup2 = wp.IsInRole(@"domain\groupName2");

难倒...所以我打了我的系统书呆子,我们仔细检查了一切。 用户是一组成员? 是。 集团名称拼写是否正确? 是。 下一步是抽丝的SID。

第三次尝试:搜索身份的集团回收

在我的控制器我检查WindowsIdentity并通过集团回收的麻烦组的SID看看:

var wi = (WindowsIdentity)wp.Identity;
var group = wi.Groups.SingleOrDefault(g => g.Value == "group1-sidValue");

group变量是SecurityIdentifier对象。 因为它是不为空,我们可以肯定的是该当前用户是,无论是所述组的成员[Authorize()]IsInRole()尝试失败确认。

第四次尝试:DirectoryServices.AccountManagement

在这一点上,我要坚果和添加参考AccountManagement的API。 我搜索域上下文GroupPrincipal按名称和SID:

   var pc = new PrincipalContext(ContextType.Domain, "domain");
   var gp1byName = GroupPrincipal.FindByIdentity(pc, "groupName1")
   var gp1bySid = GroupPrincipal.FindByIdentity(pc, IdentityType.Sid, "group1-sidValue");

这两个组的主要变量是成熟与同一个对象,并通过我的手表变量校长核实Members集合包含一个UserPrincipal具有相同的SID与当前对象WindowsPrincipalHttpContext

题:

在地狱有什么我错过了吗? 为什么这两个角色检查,当它是清楚和明白,通过对象的探索用户是该给定组的有效成员的方法失败?

事实上,一组检查罚款和其他似乎并不在这一点上最奇怪的一部分。

Answer 1:

回答:

本质上,它是两者之间的转化问题WindowsIdentityNTAccount (这两个System.Security.Principal的),最后,实际的Active Directory条目。

当在验证WindowsIdentity对广告,如果你想使用比山姆或其他希德什么,你将需要使用System.DirectoryServices.AccountManagement

警告:在.NET 4.5的安全主体包括索赔但这是断章取义。


长说明:

在Windows身份验证的Web应用程序, HttpContext.User是一个WindowsPrincipal对象包装一个基本WindowsIdentity

WindowsIdentity为大多数的意图和目的只有两个属性与身份验证的用户可以识别: NameUser

这些属性转化为对身份的相应的AD帐户条目的两个属性:

WindowsIdentity.Name = SamAccountName

WindowsIdentity.User = SID

[Authorize]过滤器属性最终调用IsInRole(string role)于底层主要...和IsInRole()串过载实例化一个NTAccountrole (以下简称“Sam帐户”在AD条目)。

这解释了在#1和上述第2条的失败。

授权HttpContext.User反对什么,但他/她的希德或SAM帐户,你需要DirectoryServices.AccountManagement或经典LDAP。



Answer 2:

我使用Windows身份验证的ASP.Net MVC应用程序,我检查组成员对控制器操作的安全性。 简单,因为它的声音,我发现可以解决我遇到的问题没有其他问题。 我花了很多时间找东西http://www.c-sharpcorner.com/uploadfile/scottlysle/test-for-user-group-membership-in-Asp-Net-C-Sharp/

检查我的代码,如果用户属于的AD组:

foreach (System.Security.Principal.IdentityReference group in System.Web.HttpContext.Current.Request.LogonUserIdentity.Groups)
{
     if (String.Equals(group.Translate(typeof(System.Security.Principal.NTAccount)).ToString(), @"your_domain_name\your_group_name", StringComparison.InvariantCultureIgnoreCase))
     {
         // the user belongs to a group 
     }
}

这就是我需要旁<authentication mode="Windows"/>在Web.config文件



文章来源: Active Directory Group Membership Checking in .Net 4.5