2009-12-08 2 views
3

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

При попытке проверить, что при условии, идентификатор пользователя существует в 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, струнного identityValue, DateTime refDate) в System.DirectoryServices.AccountManagement.Principal .FindByIdentity WithType (контекст PrincipalContext, тип mainType, String identityValue) в System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity (PrincipalContext context, String identityValue) at ***** IsWindowsIDValid (String strWindowsID) в *****. Ascx .cs: ​​строка 193

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

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

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

-Patrick

ответ

5

старый вопрос, но я имел такую ​​же ошибку. Для меня проблема в том, что 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

Еще один запоздалый ответ на старый вопрос, но эта статья помогла мне устранить это в моем случае: 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> 
Смежные вопросы