2016-03-07 5 views
0

У меня есть PrincipalContext, который использует SSL. Это отлично работает при использовании метода Context.ValidateCredentials(). Но когда мне нужно найти пользователя с помощью UserPrincipal.FindByIdentity(), я получаю следующее сообщение об ошибке:UserPrincipal с контекстом, который использует SSL

System.Runtime.InteropServices.COMException: The server is unwilling to process the request. at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_SchemaEntry() at System.DirectoryServices.AccountManagement.ADStoreCtx.IsContainer(DirectoryEntry de) at System.DirectoryServices.AccountManagement.ADStoreCtx..ctor(DirectoryEntry ctxBase, Boolean ownCtxBase, String username, String password, ContextOptions options) at System.DirectoryServices.AccountManagement.PrincipalContext.CreateContextFromDirectoryEntry(DirectoryEntry entry) at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() --- End of inner exception stack trace --- at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit() at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, String identityValue) at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, String identityValue)

Мой метод:

public List<string> GetUserInfo(string user) { 
     var list = new List<string>(); 

     using (var context = new PrincipalContext(ContextType.Domain, "xxxx.xxxx.xxxx:636", "DC=xxxx,DC=xxxx,DC=xxxx", ContextOptions.SimpleBind | ContextOptions.Sealing | ContextOptions.SecureSocketLayer)) { 
      var uP = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, user); 

      //Do stuff with uP 
     return list; 
    } 

Но это работает отлично:

public bool ValidateCredentials(string username, string password) { 
     using (var context = new PrincipalContext(ContextType.Domain, "xxxx.xxxx.xxxx:636", "DC=xxxx,DC=xxxx,DC=xxxx", ContextOptions.SimpleBind | ContextOptions.Sealing | ContextOptions.SecureSocketLayer)) { 
      return context.ValidateCredentials(username, password); 
     } 
    } 

Почему я не могу работать с UserPrincipal, используя контекст с SSL? Если я удалю SSL, он отлично работает.

ответ

1

Я изменил свой контекстOptions на переговоры и SSL. Тогда это сработало

+0

У меня была та же проблема. Попробовал изменить параметры для ведения переговоров и SSL. Точное сообщение об ошибке. Вы уверены, что это решило вашу проблему, и вы не просто вернулись к порту 389? –

+0

Да, это сработало для меня, с портом 636. Вы проверили в брандмауэре, если видите что-нибудь там? Я также использовал это решение с сервера в DMZ – MrProgram

+0

Да. Я даже отключил брандмауэр. Когда эти две машины находятся в разных доменах, но подключены через интрасеть, это работает. Когда две машины находятся на разных доменах, но подключаются через Интернет, это терпит неудачу. –