.net – 如何检查用户是属于AD组还是嵌套组?
我有一个使用
Windows身份验证的ASP.NET 3.5应用程序并实现我们自己的RoleProvider.
问题是我们想要将对一组页面的访问限制为几千个用户,而不是逐个输入所有这些页面,我们发现它们属于一个AD组. 答案很简单,如果我们检查特定用户的成员资格的公共组是它的直接成员,但我遇到的问题是,如果该组是另一个组的成员,然后是另一个组的成员,那么我的代码总是返回false. 例如:假设我们要检查User是否是E组的成员,但是User不是* E“的直接成员,她是”A“的成员,其中”B“的成员确实是其成员E,因此用户是* E的成员 我们的解决方案之一非常缓慢,尽管它给出了正确的答案 using (var context = new PrincipalContext(ContextType.Domain)) { using (var group = GroupPrincipal.FindByIdentity(context,IdentityType.Name,"DL-COOL-USERS")) { var users = group.GetMembers(true); // recursively enumerate return users.Any(a => a.Name == "userName"); } } 原始解决方案以及我尝试使用.NET 3.5 System.DirectoryServices.AccountManagement工作,当用户是相关组的直接成员时,它确实有效,如下所示: public bool IsUserInGroup(string userName,string groupName) { var cxt = new PrincipalContext(ContextType.Domain,"DOMAIN"); var user = UserPrincipal.FindByIdentity(cxt,IdentityType.SamAccountName,userName); if (user == null) { return false; } var group = GroupPrincipal.FindByIdentity(cxt,groupName); if (group == null) { return false; } return user.IsMemberOf(group); } 最重要的是,我们需要检查成员资格,即使这些组嵌套在很多级别中. 非常感谢! 解决方法
解决方案1:使用web.config限制访问
由于您使用的是ASP.NET,因此限制访问的更简单的解决方案是在web.config中设置它,示例如下: <configuration> <location path="protected/url/path"> <system.web> <authorization> <allow roles="DOMAINgroup"/> <deny users="*"/> </authorization> </system.web> </location> </configuration> 欲了解更多信息:http://msdn.microsoft.com/en-us/library/wce3kxhd.aspx和http://msdn.microsoft.com/en-us/library/b6x6shw7.aspx. 解决方案2:更快地实现IsUserInGroup 我在.NET 2.0应用程序中使用的代码,在与您的林业相当的大森林中运行良好. static bool IsUserInGroup(DirectoryEntry user,string groupName) { user.RefreshCache(new string[] {"tokenGroups"}); for (int i = 0; i < user.Properties["tokenGroups"].Count; i++) { SecurityIdentifier sid = new SecurityIdentifier((byte[]) user.Properties["tokenGroups"][i],0); try { NTuser nt = (NTuser) sid.Translate(typeof(NTuser)); if (nt.Value.ToLower().EndsWith("" + groupName.ToLower())) { return true; } } catch (IdentityNotMappedException) { continue; } } return false; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 使用MvcBuildViews构建Razor = true失败
- asp.net-mvc-3 – 从剃刀视图引用资源文件
- asp.net-core – 将应用程序root路由到/ swagger
- 缺少ASP.NET_SessionId
- asp.net – Telerik rad日期选择器在将来日期用户键时显示错
- asp.net-mvc – MVC – 强类型视图被破坏
- 使用ASP.Net webforms和MVC进行Ninject
- entity-framework-4 – 工作单元是否应指向服务层或存储库?
- asp.net-mvc – 如何在ASP.NET MVC中执行[RequireHttps(Red
- ASP.NET项目大小
- asp.net-mvc-4 – MVC 4 RC – Aspnet_regsql.ex
- 提交前台table中的值到后台的几种方式
- asp.net-mvc – 如何覆盖视图布局声明
- asp.net-mvc – 不需要必需属性的bool属性
- .net core使用sentry添加程序异常报警功能
- asp.net – RESTful验证密码服务
- asp.net核心 – JSON属性现在从ASP .Net Core 1.
- asp.net – 无法使用PreSendRequestHeaders()覆盖
- 在asp.net App_Code目录中使用Nemerle
- model-view-controller – 有没有办法在ASP.MVC