Я использую класс DirectoryEntry для аутентификации LDAP. Он отлично работает, когда я использую одну строку подключения LDAP. Но как только я начинаю выполнять код в нескольких потоках для нескольких строк подключения LDAP, он начинает случайным образом генерировать исключение аутентификации, даже если имя пользователя и пароль верны. Я использую следующий код.
public bool IsAuthenticated(string path, string domain, string group, string username, string pwd)
{
string domainAndUsername = domain + @"\" + username;
LogManager.Application.DebugFormat("Inside IsAuthenticated for User {0} from Domain {1} and Group {2} of Path {3} ", username, domain, group, path);
try
{
using (DirectoryEntry entry = new DirectoryEntry(path, domainAndUsername, pwd))
{
entry.AuthenticationType = AuthenticationTypes.Secure;
entry.RefreshCache();
//Bind to the native AdsObject to force authentication.
object obj = entry.NativeObject;
using (DirectorySearcher search = new DirectorySearcher(entry))
{
search.Filter = "(SAMAccountName=" + username + ")";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)
{
LogManager.Application.ErrorLogFormat("User {0} is not available in Domain {1}", username, domain);
return false;
}
}
LogManager.Application.DebugFormat("User {0} is available in Domain {1}", username, domain);
return true;
}
}
catch (Exception ex)
{
LogManager.Application.ErrorLogFormat("Exception occured while authenticating user {0} : Error {1} ", username, ex.Message);
return false;
}
}
Эта функция предоставляется через веб-сервис ASMX. Эта веб-служба выполняется одновременно несколькими пользователями. Каждый пользователь предоставляет путь (LDAP://{IP}/DC={Domain},DC=COM)
, домен и учетные данные. Таким образом, одновременно выполняется код для нескольких соединений LDAP.
ОБНОВИТЬ:
Это функция веб-службы ASMX, которая вызывает указанную выше функцию:
public class ValidateUserService : System.Web.Services.WebService
{
[WebMethod]
public Models.AuthenticationToken IsUserAuthenticated(string username, string password, string partnerName)
{
string path;
string group;
string domain;
// Internal Code to pull the domain name, group and path from the db with help of partnerName.
//each partner will have different path (LDAP conenction string) and domain.
bool isAuthenticated = IsAuthenticated(path, domain, group, username, password);
}
}
Я заметил, что когда несколько пользователей из разных AD пытаются выполнить этот код, он случайным образом выдает ошибку аутентификации. Как видите, в коде нет статической переменной. Таким образом, для каждого вызова создается новый экземпляр DirectoryEntry
. Таким образом, на более высоком уровне этот код настройки должен работать с несколькими соединениями LDAP.
Сказав это, кто-нибудь видел такое поведение? Обменивается ли .net framework внутренними данными между несколькими DirectoryEntry
экземплярами? Может ли один процесс иметь несколько одновременных подключений LDAP? Любая помощь, предложение или указатели приветствуются.
IsAuthenticated
через веб-сервис ASMX или нет? - person VMAtm   schedule 21.04.2015IsAuthenticated
? - person VMAtm   schedule 21.04.2015