Сбой FindByIdentity с PricipalOperationException в веб-приложении ASP.NET - PullRequest
3 голосов
/ 08 декабря 2009

Я борюсь с проблемой использования System.DirectoryServices.AccountManagement в моем внутреннем веб-приложении. Ошибка не очень наглядна, но вот что происходит:

Когда я пытаюсь проверить, существует ли предоставленный идентификатор пользователя в AD, я делаю это с помощью следующего кода:

private bool IsWindowsIDValid(string strWindowsID) 
{ 
var context = new PrincipalContext(ContextType.Domain, "DOMAINSERVER", "DC=DOMAINNAME,DC=net"); 
var userPrincipal = UserPrincipal.FindByIdentity(context, strWindowsID); 
return (userPrincipal != null); 
} 

Однако, исключение - это бросить во второй строке, где вызывается FindByIdentity. Вот подробности исключения:

Сообщение: «Произошла ошибка операции».

Трассировка стека:

в System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit () в System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit () в System.DirectoryServices.AccountManagement.PrincipalContext.Initialize () в System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx () в System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper (контекст PrincipalContext, тип PrincipalType, Nullable`1 identityType, String identityValue, DateTime refDate) в System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType (контекст PrincipalContext, тип PrincipalType, String identityValue) в System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (контекст PrincipalContext, String identityValue) в *****. IsWindowsIDValid (String strWindowsID) в *****. ascx.cs: строка 193

Эта же ошибка возникает, если я пытаюсь также проверить свойство ConnectedServer PrincipalContext. Тем не менее, я могу попытаться проверить учетные данные в контексте (используя context.ValidateCredentials ()), и это пройдет очень хорошо.

Есть идеи относительно того, что может происходить? Я могу нормально запустить этот код в автономном консольном скрипте на моем компьютере - это происходит в моей локальной среде разработки, внутри VisualStudio, когда я пытаюсь отладить веб-приложение. Это проблема с разрешениями или что-то еще? Я довольно потерян в этот момент.

Я ценю любую помощь!

-Patrick

Ответы [ 2 ]

5 голосов
/ 18 августа 2010

Старый вопрос, но у меня была такая же ошибка. Для меня проблема в том, что PrincipalContext не работает без имени пользователя и пароля в его конструкторе ... Я получаю точно такое же сообщение об ошибке всякий раз, когда я вызываю любой метод или свойство UserPrincipal (или на PrincipalContext в этом отношении).

Если указать имя пользователя и пароль пользователя домена с разрешениями Active Directory для указанного вами контейнера, вызов FindByIdentity должен завершиться успешно:

var context = new PrincipalContext(ContextType.Domain, "DOMAINSERVER",
                                   "DC=DOMAINNAME,DC=net", userName, pw); 
var userPrincipal = UserPrincipal.FindByIdentity(context, strWindowsID); 

Для меня это не решение, потому что у меня не будет этих двух параметров. Но именно поэтому вы получаете ошибку, которую вы получаете.

Согласно справке Microsoft, выполнение вашего собственного способа должно выполняться с учетными данными вызывающего процесса ... но независимо от того, под кем я выполняю (и проверил олицетворение) вызовы объекта UserPrincipal без указание имени пользователя и pw на его PrincipalContext просто не будет работать.

Надеюсь, что с опозданием помогает, Джеймс

0 голосов
/ 11 августа 2013

Еще один запоздалый ответ на старый вопрос, но эта статья помогла мне устранить его в моем случае: http://support.microsoft.com/kb/329986

Я получаю "ошибку операций", аналогичную той, что в этом посте.

Подсказкой было предложение протестировать его вне вашего веб-приложения. Поэтому я создал консольное приложение, добавил ссылку на System.DirectoryServices.AccountManagement и ввел следующий код:

private static void Main(string[] args)
    {

        var adGroups = new List<string>();

        using (var principalContext = new PrincipalContext(ContextType.Domain))
        {
            using (var user = UserPrincipal.FindByIdentity(principalContext, @"MYDOMAIN\MYUSERNAME"))
            {
                if (user == null) return;

                var groups = user.GetAuthorizationGroups();
                adGroups.AddRange(from @group in groups
                                  where @group.Name.ToUpper().Contains("SOME-STRING-COMMON-TO-ALL-THE-AD-GROUPS-PERTINENT-TO-MY-MVC-APP")
                                  select @group.Name);
            }
        }
    }

Это сработало, поэтому я был убежден, что моей проблемой является проблема «двойного прыжка», описанная в статье MS.

Решение состояло в том, чтобы олицетворение было включено в моем файле web.config. (Это приложение для внутренней сети, поэтому у меня включен режим проверки подлинности Windows и включена олицетворение; это решило проблему).

<system.web>
    <httpRuntime targetFramework="4.5" />
    <compilation debug="true" targetFramework="4.5" />
    <authentication mode="Windows" />
    <identity impersonate="true" />
    <authorization>
            <deny users="?" />
    </authorization>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...