Я пытаюсь создать простое веб-приложение для навигации / администрирования каталогов.
Требования к применению:
- Доступ пользователя к домену 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, пока активен веб-сеанс?