使用C#从ASP.Net MVC访问Active Directory
我需要访问Active Directory以获取有关客户所属组的信息。 我的项目是使用C#的ASP.Net MVC应用程序。 我之前从未编写过针对Active Directory的编程,并且需要一些关于最佳入门方法的建议,使用什么安全模型来访问信息,并且可能指向一些好的教程。
由于您正在使用MVC,因此您可以访问.NET 3.5中的新System.DirectoryServices.AccountManagement命名空间。 这些类应该优先于DirectoryServices本身的旧类,因为它们使用起来要简单得多。 有一些问题在3.5中没有解决(例如,在查询组时有1500个成员限制),但我确信这些已在.NET 4.0中得到修复。 对于大多数任务,新类非常有效。
using (var context = new PrincipalContext( ContextType.Domain )) { using (var user = UserPrincipal.FindByIdentity( context, "username" )) { var groups = user.GetAuthorizationGroups(); ... } }
使用System.DirectoryServices
命名空间访问AD。
两个最重要的课程是:
- DirectoryEntry ;
- DirectorySearcher 。
假设您的域名是: MyIntranet.MyCompany.com
然后,您将必须创建DirectoryEntry
类的根实例:
DirectoryEntry root = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com");
在AD中搜索组或用户的特定出现时:
DirectorySearcher searcher = new DirectorySearcher(); searcher.SearchRoot = root; searcher.SearchScope = SearchScope.Subtree;
假设您要查找名为AnyUser1的用户名,DirectorySearcher.Filter应如下所示:
searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})", "AnyUser1");
然后,通过SearchResult类获取结果,如下所示:
bool userFound = false; SearchResult foundUser = null; try { foundUser = searcher.FindOne(); // You might as well use the FindAll() method if you expect more then one result. userFound = foundUser != null; } catch(Exception) { throw; } if (!userFound) return; DirectoryEntry user = foundUser.GetDirectoryEntry();
然后,您可以通过memberOf属性获取此用户所属的组:
user.Properties("memberOf").Value
有关概述,请参阅此CodeProject文章: 如何(几乎)在Active Directory中的所有内容 。
还有一个属性列表: IADsUser属性和Active Directory属性之间的映射 。
编辑#1
如果您正在使用模拟,您可能会考虑为应用程序设置一些参数,例如DefaultRootDomain , DefaultUserName和DefaultPassword ,然后在实例化根DirectoroEntry
时使用它们。
public static class AdHelper { public static string DefaultRootDse { get { return Properties.Settings.Default.DefaultRootDomain; } } private static string DefaultUserName { get { return Properties.Settings.Default.DefaultUserName; } } private static string DefaultPassword { get { return Properties.Settings.Default.DefaultPassword; } } public static DirectoryEntry RootDse { get { if (_rootDse == null) _rootDse = new DirectoryEntry(DefaultRootDse, DefaultUserName, DefaultPassword); return _rootDse; } } private static DirectoryEntry _rootDse; }
如果你有.NET 3.5或者你可以升级到它 – 请System.DirectoryServices.AccountManagement
使用System.DirectoryServices.AccountManagement
的新function!
有关更多信息和快速入门,请参阅MSDN杂志上.NET Framework 3.5中的管理目录安全主体这篇精彩的介绍文章。
为什么不System.Web.Security? 它也存在于2.0框架中
即: http : //msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.85 ),现在在框架4.0中: http : //msdn.microsoft.com/en- us / library / system.web.security.activedirectorymembershipprovider(v = vs.100 )
- 如何使用System.DirectoryServices.ActiveDirectory.Domain类获取域别名
- C#Active Directory调用“ChangePassword”无法联系域
- GroupPrincipal.Members.Remove()不适用于大型AD组
- Active Directory(LDAP) – 检查帐户被锁定/密码已过期
- 如何知道DirectoryEntry是用户还是组?
- 在Active Directory中搜索与电子邮件地址关联的所有用户名
- 在Active Directory中找不到Locked属性(C#)
- Active Directory:调整函数的性能以检索组成员
- 如何将AcquireTokenAsync中收到的令牌与Active Directory一起存储