постоянный сеанс с проверкой подлинности ldap - PullRequest
0 голосов
/ 15 декабря 2011

Я пытаюсь создать простое веб-приложение для навигации / администрирования каталогов.

Требования к применению:

  • Доступ пользователя к домену Active Directory (или другой службы каталогов) это веб-приложение и войдите под тем же доменным именем пользователя / паролем полномочия.
  • Затем пользователь может перемещаться по дереву каталогов, создавать / редактировать записи, редактировать атрибут записи и т.д ..

Я использую perl Net :: LDAP для операций ldap, как в:

#!/usr/bin/perl -wT

use Net::LDAP;
use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);

my $ssl = 1;
my $srv = '192.168.56.110';
my $uri = $ssl ? 'ldaps://' : 'ldap://';

my $c = Net::LDAP->new($uri . $srv) or
    die "Unable to connect to server: $@\n";

# !!! This is a temporary workaround !!!
my $binddn = "cn=Administrator,cn=users,dc=example,dc=com";
my $passwd = "password";

my $mesg = $c->bind($binddn, password => $passwd);
die 'Unable to bind: ' . $mesg->error . "\n" if $mesg->code;

# DN to be deleted
my $dn = param('DN');

$mesg = $c->delete($dn);
die 'Error in delete: '. $mesg->error() ."\n" if $mesg->code();

$c->unbind;

Я могу вызвать этот скрипт cgi с помощью HTML-формы, например:

<form action="/cgi-bin/del.cgi" method="post">
<br>Peter Parker
<input type="radio" name="DN"
    value="cn=peter parker,cn=users,dc=example,dc=com">
<br>Clark Kent
<input type="radio" name="DN"
    value="cn=clark kent,cn=users,dc=example,dc=com">
<br>
<input type="submit" value="Delete User">
</form>

Проблема с этим кодом заключается в том, что операции ldap используют учетные данные администратора, а не учетные данные пользователя, выполняющего веб-приложение. Я использую этот обходной путь, потому что я не могу каждый раз запрашивать у пользователя его / ее учетные данные ... и я не знаю, как сохранить постоянную аутентификацию пользователя.

Мое веб-приложение аутентифицирует пользователя с помощью ldap, запрашивая его учетные данные и отправляя запрос на привязку в службу каталогов, как в:

...
# read user supplied credentials
my $user_id = param('user_id');
my $password = param('password');

# now find the DN of user_id in directory
my $ssl = 1;
my $srv = '192.168.56.110';
my $uri = $ssl ? 'ldaps://' : 'ldap://';

my $c = Net::LDAP->new($uri . $srv) or
    die "Unable to connect to server: $@";

# admin credentials are needed here to find the user DN
my $rootdn = "cn=Administrator,cn=users,dc=example,dc=com";
my $rootpw = "secret";

my $mesg = $c->bind($rootdn, password => $rootpw);
die "Unable to bind: ". $mesg->error if $mesg->code;

$mesg = $c->search(
    base    => 'dc=example,dc=com',
    scope   => 'sub',
    filter  => "(&(objectClass=user)(sAMAccountName=$user_id))",
    attrs   => ['sAMAccountName'],
);
die "Bad search: ". $mesg->error() if $mesg->code();

my ($entry) = $mesg->entries;
die "User not found: $user_id\n" unless $entry;

my $dn = $entry->dn;

# User DN found.. now check the credentials
$mesg = $c->bind($dn, password => $password);
die "Unable to bind: ". $mesg->error if $mesg->code;

$c->unbind();

# credentials validated!
print header, start_html('Welcome!'), h1('Hello, YOU!'), end_html;

После этого в браузер пользователя отправляется файл cookie, инициирующий веб-сеанс. Я мог бы сохранить учетные данные пользователя в базе данных, а затем передавать их в del.cgi (и другие подобные сценарии) в любое время, когда мне было нужно ... но я не думаю, что это хорошая практика безопасности

Что я могу сделать, чтобы сохранить постоянный сеанс аутентификации ldap, пока активен веб-сеанс?

1 Ответ

0 голосов
/ 17 декабря 2011

Нет сеанса.Когда клиент LDAP подключается к серверу каталогов, соединение не проходит проверку подлинности.Запрос на связывание, если он будет успешным, устанавливает состояние авторизации соединения.Соединение остается в этом состоянии авторизации до следующего запроса на связывание, отключения клиента или отключения сервера.В зависимости от локальной настройки, может быть возможно держать соединение открытым неопределенно долго с помощью keep-alives или чего-то подобного.или клиент может периодически передавать другой запрос на связывание.Современные серверы каталогов профессионального качества поддерживают отключение незанятых клиентов или отключение клиентов по истечении определенного периода времени или после передачи заданного числа операций LDAP.Обратите внимание, что сетевые администраторы могут запретить постоянные соединения по своим собственным причинам.

  • Клиенты LDAP должны проверять средства управления ответами после запросов LDAP.Отказ от проверки элементов управления ответом приведет к тому, что клиент пропустит важную информацию с сервера.
  • Клиенты LDAP должны знать, что сервер может отправлять незапрошенное уведомление в форме расширенного результата.Невозможность обработать незапрошенное уведомление может привести к клиенту LDAP с плохим поведением.Большинство уведомлений являются уведомлениями об отключении, то есть сервер отключает клиент по любой причине.

Для получения дополнительной информации см. "LDAP: Практика программирования" .

Из любопытства, зачем код такой вещи?Apache Directory Studio - отличный клиент LDAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...