Одна вещь, по которой мне неясно, это ваш вопрос о получении имени домена по заданному каталогу в контроллере домена. Я предполагаю, что у вас есть сервер, который может видеть несколько доверенных доменов, и что пользователь может войти в ваше приложение с любого из них, чтобы вы не знали, с каким доменом вам нужно проверить членство в роли.
Для управления доступом к функциям через членство в ADGroup, вы можете использовать
HttpContext.Current.User.IsInRole("appdomain\groupname")
где User.Identity.Name == "userdomain \ user". Я не знаком с проблемами доверия к домену, но это предполагает, что вы можете добавлять пользователей из доверенного домена в группу домена, которой вы управляете, чтобы вам не пришлось беспокоиться о расположении домена группы.
Если вы не можете или если у вас есть одно и то же имя группы в каждом другом домене, то вы могли бы сделать что-то подобное?
HttpContext.Current.User.IsInRole(userDomainname + "\groupname")
Некоторые баллы:
- , если у вас уже нет большой установленной базы кодов AD, я бы рекомендовал использовать объекты из пространства имен System.DirectoryServices.AccountManagement.
- Я настоятельно рекомендую утилиту ADExplorer от Sysinternals, чтобы получить более детальное представление LDAP о ваших доменах, которое помогает при работе со строками подключения LDAP и программированием каталогов в целом.
- Если вы знакомы с взаимодействием и вам нужно выполнить любой анализ строки соединения LDAP, проверьте этот сайт .
- System.DirectoryServices.AccountManagement. PrincipalContext.Container и System.DirectoryServices. DirectoryEntry.Path свойства возвращают строку подключения LDAP с доменом в конце строки ( т.е. DC = моя компания, DC = com)
- Не забывайте о старом надежном Environment.UserDomainName & Environment.UserName (который извлекает WindowsPrincipal из текущего выполняющегося потока; см. Таблица 1: Поток Exposed CurrentPrincipal Object @ http://msdn.microsoft.com/en-us/library/Aa480475.aspx для отличная таблица того, что текущий пользователь находится в среде выполнения asp.net.)
** ОБНОВЛЕНИЕ 08.06.2011 14:15 **
Если я правильно понимаю AD, домен пользователя является неотъемлемой частью объекта пользователя, возвращаемого AD. Расширяя на вашем примере "Боб Ньюаккаунт" ...
Итак, учитывая следующие 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
}
Таким образом, вы сможете получить домен пользователя через различимое имя или userPrincipalName свойства активного каталога. (Примечание: у меня нет удобной настройки двух доменов, поэтому я не могу сейчас протестировать приведенный выше код.) Это становится ближе?