Как получить учетные данные AD с клиентского компьютера в веб-приложении?

Можно ли получить учетные данные ActiveDirectory для пользователя на клиентском компьютере из веб-приложения?

Чтобы уточнить, я разрабатываю веб-приложение, которое будет размещено в интрасети клиента.

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


person carter    schedule 10.10.2008    source источник
comment
Какой фреймворк для веб-приложений? АСП.НЕТ? Это будет актуально.   -  person Troy Howard    schedule 10.10.2008


Ответы (4)


Абсолютно. Это особенно полезно для интранет-приложений.

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

Active Directory можно легко запросить с помощью LDAP. Если вы используете .NET, вы можете сделать что-то вроде этот пример кода или мой пример ниже. Вы также можете сделать это внутри Среды SQL, а также.

Если вам просто нужна Windows для обработки аутентификации, вы можете настроить, например, веб-приложение .NET для Проверка подлинности Windows. Обязательно отключите анонимный вход в IIS для вашего приложения. После этого вы сможете получить доступ к имени пользователя для входа в Windows и использовать его для дальнейших проверок безопасности (например, его членство в группах/ролях в AD).

Вы также можете упростить весь этот беспорядок, используя что-то вроде Security Application Block.


Вот краткий пример C#: (конвертируйте в VB.NET здесь)

using System.DirectoryServices;

/// <summary>
/// Gets the email address, if defined, of a user from Active Directory.
/// </summary>
/// <param name="userid">The userid of the user in question.  Make
/// sure the domain has been stripped first!</param>
/// <returns>A string containing the user's email address, or null
/// if one was not defined or found.</returns>
public static string GetEmail(string userid)
{
    DirectorySearcher searcher;
    SearchResult result;
    string email;

    // Check first if there is a slash in the userid
    // If there is, domain has not been stripped
    if (!userid.Contains("\\"))
    {
        searcher = new DirectorySearcher();
        searcher.Filter = String.Format("(SAMAccountName={0})", userid);
        searcher.PropertiesToLoad.Add("mail");
        result = searcher.FindOne();
        if (result != null)
        {
            email = result.Properties["mail"][0].ToString();
        }
    }

    return email;
}

Вам не нужно указывать контроллер домена. Выполнение пустого конструктора/конструктора по умолчанию для DirectorySearcher приведет к тому, что он попытается найти его автоматически, фактически, это предпочтительный метод.

person Sean Hanley    schedule 10.10.2008
comment
Я пытался сделать что-то похожее на то, что вы описываете, но разве вам не нужно где-то указывать путь к Active Directory? - person Geoff; 10.10.2008
comment
Неа. Если вы этого не сделаете, он запросит его у вашего локального DNS. На самом деле это предпочтительный масштабируемый подход. Смотрите мой расширенный/отредактированный ответ. - person Sean Hanley; 11.10.2008
comment
Я понял, что никакая аутентификация не разрешена — пользователю даже не может быть предложено ввести встроенную аутентификацию. Это может работать, но применяются определенные условия, и это требует некоторой настройки в веб-браузере (IE). - person tvanfosson; 11.10.2008

Возможно, в .NET есть более прямой способ сделать это, но с PHP я просто обращаюсь к нашему серверу Active Directory как к серверу LDAP.

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

person Simurr    schedule 10.10.2008

Встроенная проверка подлинности Windows, пользователь должен использовать IE, И сайт должен быть в доверенных сайтах пользователя. Если эти вещи верны, то IE передаст ваш токен безопасности Windows на веб-сайт, и он будет аутентифицироваться с его помощью. Мы делаем это с SharePoint в нашей интрасети, в противном случае получить доступ к чему-либо с ограниченным доступом будет проблематично — вы будете получать запрос каждый раз, когда щелкаете документ.

person tvanfosson    schedule 10.10.2008

Нет, конечно нет. Можете ли вы представить хаос, который может привести к тому, что случайные веб-приложения смогут получить ваше имя пользователя и пароль AD?

Теперь, если вам просто нужно имя пользователя — оно находится в REMOTE_USER, если вы используете встроенную аутентификацию Windows. . И Windows auth автоматически войдет в систему пользователя на вашем сайте - при условии, что вы используете общий домен (или доверяете).

Редактировать: IWA работает в сценарии интрасети, поскольку IE по умолчанию включает сайты интрасети в зону безопасности интрасети. Кроме того, системный администратор может использовать GPO для установки других доверенных сайтов. Firefox также поддерживает NTLM, как и Opera и Chrome. В целом, это неплохой способ настроить интрасеть.

Обратите внимание, однако, что вы не получаете учетные данные. Вы согласовываете токен с клиентом, что обеспечивает безопасность IWA (и мой пункт выше актуален).

person Mark Brackett    schedule 10.10.2008
comment
В оригинальном плакате упоминалось, что сайт будет размещен во внутренней сети клиента. Ваше мнение о безопасности спорно. - person Nasir; 11.10.2008
comment
Безопасность никогда не бывает спорной. Даже если интрасеть ограничена диапазонами IP-адресов, вы все равно хотите убедиться, что человек, использующий ее, является тем, кем он себя называет. Помещение сайта в доверенный сайт пользователя — это единственный способ автоматически передавать учетные данные из браузера надежным способом. - person tvanfosson; 11.10.2008
comment
@ nsr81: Да, ОП упомянул об этом примерно через час после того, как я опубликовал свой ответ. Что, кстати, по-прежнему является правильным ответом, потому что вы не получаете учетные данные — вы получаете согласованный хэш, который позволяет вам получить токен для пользователя. - person Mark Brackett; 11.10.2008