аутентификация ldap для веб-приложений - PullRequest
0 голосов
/ 08 мая 2018

пожалуйста, уделите несколько минут и полностью прочитайте мой вопрос .вот моя проблема: я хочу подключиться к серверу LDAP с помощью C # для веб-приложения, означает, что клиенты подключаются к серверу asp.net.

* -Сервер LDAP и сервер приложений не совпадают.

** - Они не находятся в одном домене.

Я пытался 4 различными способами и не смог решить проблему ни одним из них.

1-

        var credentials = new NetworkCredential(username, password);
        var serverId = new LdapDirectoryIdentifier("domain.net");

        var conn = new LdapConnection(serverId, credentials);
            conn.Bind();

2-

System.DirectoryServices.DirectoryEntry entry = new System.DirectoryServices.DirectoryEntry("LDAP://domain.net/DC=domain,DC=net");
                entry.Username = "username";
                entry.Password = "password";
                System.DirectoryServices.DirectorySearcher searcher = new System.DirectoryServices.DirectorySearcher(entry);
                searcher.Filter = "(&(objectClass=user))";
                var results = searcher.FindAll();

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

3-

   PrincipalContext pc = new PrincipalContext(ContextType.Domain, "domain.net");
   var ret = pc.ValidateCredentials(model.UserName, model.Password);

проблема в том, что сервер должен находиться в домене сервера ldap.у нас есть это ограничение !!

4-

https://auth0.com/blog/using-ldap-with-c-sharp/

public bool validateUser(string username, string password)
{
    var sha1 = new SHA1Managed();
    var digest = Convert.ToBase64String(sha1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)));
    var request = new CompareRequest(string.Format("uid={0},ou=users,dc=example,dc=com", username),
        "userPassword", "{SHA}" + digest);
    var response = (CompareResponse)connection.SendRequest(request);
    return response.ResultCode == ResultCode.CompareTrue;
}

этот код ничего не возвращает.будет очень полезно, если есть запрос для сравнения имен пользователей и паролей.этот код, кажется, использует этот способ, но существуют различные типы алгоритмов хеширования.Я пытался использовать SHA1 и MD5, а также userPassword, атрибут unicodePwd.но возвращение пусто все время.

это лучшее решение для размещения обоих серверов в одном домене?любое другое решение, большое спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

Способ 1 - самый простой способ. Если это не сработает, ничего не получится. Поэтому вам придется изменить свою конфигурацию, чтобы она заработала.

Когда вы говорите:

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

Что ты имеешь в виду? Вы явно отказываете в правах входа в систему для контроллеров домена? Есть ли проблемы с сетью между компьютером, на котором он запущен, и контроллером домена (можете ли вы подключиться к порту 389 на контроллере (ах) домена)?

Обновление: PrincipalContext.ValidateCredentials просто привязывает LDAP позади - он использует LdapConnection. Вы можете увидеть исходный код здесь . Вероятная причина, по которой ValidateCredentials работает на доменном компьютере, а не в противном случае, заключается в том, что по умолчанию используется проверка подлинности Kerberos, которая будет работать только с компьютера домена.

То же самое относится и к LdapConnection. Поэтому попробуйте установить режим аутентификации. Например, попробуйте Basic

var credentials = new NetworkCredential(username, password);
var serverId = new LdapDirectoryIdentifier("domain.net");

var conn = new LdapConnection(serverId, credentials, AuthType.Basic);
conn.Bind();

или посмотрите доступные значения и попробуйте, что работает.

...