C # Active Directory PrincipalContext / UserPrincipal.IsMemberOf ошибка - PullRequest
7 голосов
/ 03 января 2012

Итак, у меня есть вопрос, который я, честно говоря, не совсем уверен, как его задать. По сути, у меня есть немного кода, который фантастически работает на моей локальной машине, когда я его запускаю. Как только я публикую его на нашем веб-сервере разработки, он не работает. Я не уверен, что это проблема установки IIS, проблема web.config или проблема с кодированием.

Вот фрагмент кода

    bool isMember = false;

    PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain);
    UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID);

    if (user.IsMemberOf(ADDomain, IdentityType.Name, groupName.Trim()))
    {
        isMember = true;
    }

    return isMember;

Когда я передаю имя пользователя и группу, и мне сообщается, является ли этот пользователь членом этой группы. Нет проблем. Отлично работает на моей машине. Я пошел, чтобы опубликовать этот код на веб-сервере, и он терпит неудачу, когда он попадает в строку

UserPrincipal user = UserPrincipal.FindByIdentity(ADDomain, userID); 

выдает эту ошибку:

[DirectoryServicesCOMException (0x80072020): произошла ошибка операций.]
System.DirectoryServices.DirectoryEntry.Bind (Boolean throwIfFail) + 788
System.DirectoryServices.DirectoryEntry.Bind () + 44
System.DirectoryServices.DirectoryEntry.get_AdsObject () + 42
System.DirectoryServices.PropertyValueCollection.PopulateList () + 29
System.DirectoryServices.PropertyValueCollection..ctor (DirectoryEntry запись, String propertyName) + 63
System.DirectoryServices.PropertyCollection.get_Item (String propertyName) +163 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer () + 521217
System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit () + 51
System.DirectoryServices.AccountManagement.PrincipalContext.Initialize () + 141
System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx () + 42
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (PrincipalContext контекст, тип PrincipalType, Nullable`1 identityType, String identityValue, DateTime refDate) + 29
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (PrincipalContext context, String identityValue) + 95
Cosmic.Web.Login.btnSubmit_Click (Отправитель объекта, EventArgs e) в C: \ cosmic \ Cosmic.Web \ Login.aspx.cs: 79
System.Web.UI.WebControls.Button.RaisePostBackEvent (String eventArgument) + 154
System.Web.UI.Page.ProcessRequestMain (логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) + 3691

Есть идеи, где это может не получиться?

1 Ответ

17 голосов
/ 03 января 2012

Моим первым предположением будет то, что учетная запись пользователя, под которой вы запускаете этот код, не имеет необходимых разрешений для запроса Active Directory.

Чтобы это исправить, в основном вам нужно изменить конструктор из этого:

PrincipalContext ADDomain = new PrincipalContext(ContextType.Domain);

(устанавливает соединение с AD с текущими учетными данными по умолчанию, под которыми работает этот код)

до этого:

PrincipalContext ADDomain = 
   new PrincipalContext(ContextType.Domain, "DOMAIN", useraccount, password);

и укажите имя пользователя и пароль для учетной записи, которая, как вы знаете, обладает достаточными привилегиями для запроса Active Directory.

...