我不清楚的一件事是您关于在域控制器中检索给定目录条目的域名的问题。我假设您有一台可以查看多个受信任域的服务器,并且用户可以从其中任何一个域登录您的应用程序,这样您就不知道需要针对哪个域来测试角色成员资格。
要通过 ADGroup 成员资格控制对功能的访问,您可以使用
HttpContext.Current.User.IsInRole("appdomain\groupname")
其中 User.Identity.Name=="userdomain\user"。我不熟悉域信任问题,但这假设您可以将受信任域中的用户添加到您控制的域组中,因此您无需担心组域位置。
如果你不能,或者如果你在每个不同的域中都有相同的组名,那么你可以做这样的事情吗?
HttpContext.Current.User.IsInRole(userDomainname + "\groupname")
几点:
- 除非您已经建立了庞大的 AD 代码库,否则我建议您使用 System.DirectoryServices.AccountManagement 命名空间中的对象。
- 我强烈推荐来自 Sysinternals 的 ADExplorer 实用程序,以获得您的域的更多 LDAP 视图,这通常有助于 LDAP 连接字符串和目录编程。
- 如果您对互操作感到满意,并且需要执行任何 LDAP 连接字符串解析,请查看此site。
- System.DirectoryServices.AccountManagement.PrincipalContext.Container 和 System.DirectoryServices.DirectoryEntry.Path 属性返回带有域末尾的 LDAP 连接字符串字符串(即 DC=mycompany,DC=com)
- 不要忘记值得信赖的旧 Environment.UserDomainName 和 Environment.UserName(它从当前执行的线程中获取 WindowsPrincipal;请参阅 表 1:线程公开 CurrentPrincipal 对象@http://msdn.microsoft.com/en-us/library/Aa480475.aspx有关当前用户在 asp.net 运行时中的内容的表。)
** 2011 年 6 月 8 日下午 2:15 更新**
如果我对 AD 的理解正确,用户的域是 AD 返回的用户对象的一个组成部分。扩展您的“Bob Newaccountant”示例...
因此,鉴于以下 2 个域之间存在信任:
1. "abcdc.com"
CN=Users
CN="Bob NewAccountant"
2. "abc.com"
CN=Users
CN="Local User1"
OU=Applications
OU=MyApplication
CN=ReportReaders (Members: abcdc\BNewAccountant, abc\luser1)
您应该通过以下查询获取用户信息:
//name parameter = domain
//container parameter = distinguished name
using(var ctx = new PrincipalContext(
ContextType.Domain,
name: "abc.com",
container: "OU=MyApplication,OU=Applications,DC=abc,DC=com",
"abc\serviceaccountname",
"Password1"))
{
var officeGroup = GroupPrincipal.FindByIdentity(ctx,
IdentityType.SamAccountName,
"ReportReaders");
foreach(Principal prin in officeGroup.GetMembers(recursive: true))
{
Console.WriteLine("DistinguishedName: " + prin.DistinguishedName
+ " UPN: " + prin.UserPrincipalName);
}
//Should result in
// DistinguishedName: CN=luser1,CN=Users,DC=abc,DC=com UPN: luser1@abc.com
// DistinguishedName: CN=BNewAccountant,CN=Users,DC=abcdc,DC=com UPN: BNewAccountant@abcdc.com
}
因此,您应该能够通过活动目录的 distinguishedName 或 userPrincipalName 属性获取用户的域。 (注意:我手头没有双域设置,所以我现在无法测试上面的代码。)是不是越来越近了?