Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Вниз

DataSnap (midas) - авторизация   Найти похожие ветки 

 
AlexanderSK   (2003-10-13 14:32) [0]

Разрабатываю клиент-сервер на базе DataSnap.
Подскажите, пожалуйста, как грамотно реализовать авторизацию пользователя в этой технологии?


 
Polevi   (2003-10-13 15:09) [1]

реализовать метод Login в COM-сервере


 
Nikolay M.   (2003-10-13 15:14) [2]

Я делаю так: делаю на сервере новый интерфейс с методом function LogonUser (login, password_hash : string) : IMyRemoteDataModule;
Который вызывается из клиента (передается, кстати, не собственно пароль, а его хэш, чтобы траффик по сети не отследить). Если логон прошел нормально (в моей табличке юзеров есть такая пара логин-пароль и этот пользователь не работает в данный момент в системе), значит выдается ссылка на интерфейс RDM. Если что-то не так, генерирум исключение.
Плюс желательно для каждого пользователя хранить его права (для простоты, пусть это будет строка вида YYNNYYNNNNYYY, где каждый символ на определенном месте отвечает за разрешенность совершения некоторого действия) и считывать их в нек. переменную при логоне. А при непосредственном выполнении того или иного действия проверять эту переменную на разрешенность совершения этого действия.
Вкратце так. Может чего лишнего намудрил, но пока не вижу где :)


 
Reindeer Moss Eater   (2003-10-13 15:19) [3]

передается, кстати, не собственно пароль, а его хэш, чтобы траффик по сети не отследить

1.Трафик при этом отслеживается как и в случае с открытым паролем.

2. Перехваченный однажды хеш пароля остается дейставительным для последующих попыток логона.


 
AlexanderSK   (2003-10-13 16:24) [4]

>Nikolay M. ©
А какой-нибудь примерчик с кодом, если не трудно?


 
Nikolay M.   (2003-10-13 19:19) [5]


> Reindeer Moss Eater © (13.10.03 15:19) [3]

Угу, конечно, ловится. А если хэш делать каждый раз разный + случайное число на клиенте + хэш зависит от случайного числа, выдаваемого сервером?


> AlexanderSK (13.10.03 16:24) [4]

Пример чего?


 
Reindeer Moss Eater   (2003-10-14 09:16) [6]

А если хэш делать каждый раз разный + случайное число на клиенте + хэш зависит от случайного числа, выдаваемого сервером?

Это будет называеться Challenge-Response. И будет сильно отличаться от описанного в [2]


 
AlexanderSK   (2003-10-14 16:08) [7]

>Nikolay M. (13.10.03 15:14) [2]
А кто и как создает тот RDM с которым будет работать клиент?


 
Nikolay M.   (2003-10-14 16:17) [8]


> Reindeer Moss Eater © (14.10.03 09:16) [6]

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


> AlexanderSK (14.10.03 16:08) [7]

Естественно сервер. Точнее, фабрика класса, но тебе об этом заботиться не нужно - создастся само.


 
Reindeer Moss Eater   (2003-10-14 16:26) [9]

Интересный термин..
Какой?

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

А чем простой хеш отличается от сложного?
И чем простой хеш отличается от clear password?

А для какого-нибудь банка я бы вообще не рискнул такое делать - себе дороже потом выйдет...

Если не знать азбуки, то конечно дороже.


 
AlexanderSK   (2003-10-14 17:18) [10]

>Nikolay M. © (14.10.03 16:17) [8]
>Естественно сервер. Точнее, фабрика класса, но тебе об этом заботиться не нужно - создастся само.

т.е. Есть сервер, на нем есть недоступные извне RDM и если авторизация прошла успешно, клиент получает ссылку на интерфейс этого недоступного RDM. я правильно понимаю?


 
Reindeer Moss Eater   (2003-10-14 17:32) [11]

Подскажите, пожалуйста, как грамотно реализовать авторизацию пользователя в этой технологии?

Сервер хранит clear_pass клиента или hash(clear_pass)
Сервер генерит случайное число (Challenge) и отправляет его клиенту.
Клиент вычисляет Hash(clear_pass + случайное_число) и отправляет его серверу.
Сервер сравнивает полученное значение со значением которое вычисляет сам.
Совпало - клиент указал правильный пассворд. Не совпало - пароль неверен.

Перхватывать ответ клиента бесполезно, так как он годен только для конкретного значения Challenge сервера; Значение Challenge должно быть криптографичекого качества случайным.
Против атак по словарю готовых хеш-значений паролей обе стороны могут примешивать SALT VALUE ("соль", произвольное постоянное значение выбираемое при инсталяции системы)


 
Nikolay M.   (2003-10-14 18:17) [12]


> Reindeer Moss Eater © (14.10.03 16:26) [9]
> Интересный термин..
> Какой?

Challenge-Response


> Если не знать азбуки, то конечно дороже.

То что ты написал в [11] - азбука и есть, не нужно быть семи пядей во лбу, чтобы придумать подобную технологию. Но ты лично готов написать клиента для банка с такой авторизацией, зная, что ошибка в 17 строке или просчет в теории приведет к тому, что у банка уведут немалые суммы денег? Я - нет :(


 
Nikolay M.   (2003-10-14 18:19) [13]


> AlexanderSK (14.10.03 17:18) [10]

Абсолютно верно.


 
Reindeer Moss Eater   (2003-10-15 08:45) [14]

Nikolay M. ©

1. Это действительно азбука и изобретена действительно не мной.
А вот пользуются этой азбукой все.

2. А я -да.


 
Nikolay M.   (2003-10-15 10:02) [15]


> Reindeer Moss Eater © (15.10.03 08:45) [14]

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


 
Reindeer Moss Eater   (2003-10-15 10:20) [16]

Не от неуверенности в себе или незнания сути вопроса, а слишком больших потерь в случае неудачи - оно мне надо?

Представляешь, а ты ведь однажды умрешь. Это достаточно большая потеря для тебя.


 
Nikolay M.   (2003-10-15 10:39) [17]


> Reindeer Moss Eater © (15.10.03 10:20) [16]

Не, это будет потерей для остальных :)))


 
AlexsanderSK   (2003-10-15 16:46) [18]

>Nikolay M. © (14.10.03 18:19) [13]
А как тогда это реализовать? т.е. сделать не доступные из вне RDM, чтобы потом их интерфейс можно было отдать наружу?


 
Nikolay M.   (2003-10-16 10:11) [19]

Что мешает сделать два RDM и один создавать вручную?


 
AlexanderSK   (2003-10-16 11:00) [20]

>Nikolay M. © (16.10.03 10:11) [19]
>Что мешает сделать два RDM и один создавать вручную?
А как и когда его в ручную создавть? И как запретить мерверу самому создавать 2-ой RDM?


 
AlexanderSK   (2003-10-16 11:25) [21]

т.е. И как запретить серверу самому создавать 2-ой RDM?


 
Nikolay M.   (2003-10-16 16:11) [22]

Посмотри, что написано в rdm.pas в секции initialization.


 
AlexanderSK   (2003-10-16 17:09) [23]

>Nikolay M. © (16.10.03 16:11) [22]

А как потом создать нужный RDM?
т.е. как должн выглядеьт код метода - function LogonUser (login, password_hash : string): IMyRemoteDataModule; в той его части где возвращается IMyRemoteDataModule?


 
Nikolay M.   (2003-10-16 18:03) [24]

Может, это и изврат, но можно так:
в новом RDM в RemoteDataModuleCreate сохранить self в потоко-защищенном списке (TThreadList) и из начального модуля возвращать потом его клиенту.


 
AlexanderSK   (2003-10-17 15:34) [25]

А нет ли какого-нибудь штатного метода авторизации?


 
Nikolay M.   (2003-10-19 11:50) [26]

AFAIK, нет.
Опять же все зависит от того, какого уровня защита тебе нужна. Если требуется не дать чайнику зайти в твою программу без авторизации, то извращения с вторичными RDM не нужны, достаточно одного, в котором и будет LogonUser, соответственно юзер дальше либо идет, либо получает в лоб.
А если нужно исключить возможность написания Васей Криворучко подставного клиента для твоего AppServer-а, тогда все-таки нужно несколько RDM, процедура авторизации как сказано мной и Reindeer Moss Eater (запрос с сервера-ответ с клиента, генерация хэша в зависимости от случайного числа, серийника вина и макадреса и тд, и тп).
Возможно, конечно, что в сети что-нибудь подобное лежит или описан хотя бы алгоритм - не ты же первый озадачился такой проблемой. Если найдешь, не поленись, плз, скинь в эту ветку или на мыло/аську?


 
Reindeer Moss Eater   (2003-10-20 08:55) [27]

Алгоритм в [11]


 
Nikolay M.   (2003-10-20 11:07) [28]


> Reindeer Moss Eater © (20.10.03 08:55) [27]

В [11] - там все на пальцах, я имел в виду, что может попробовать найти UML-диаграмму готовой реализации с кусками кода, но это, конечно, халява :)


 
AlexanderSK   (2003-10-20 15:53) [29]

А как всетаки запретить пользователю лоступ к RDM?


 
Nikolay M.   (2003-10-20 16:31) [30]

Тебе ж дали уже два метода - чем не устраивают?
Если нужно совсем не дать доступа, то в OnCreate RDM-а делать сразу Free - вот и не будет ему доступа.


 
VIR   (2003-10-25 09:06) [31]

А как можно применять авторизацию Windows?


 
Nikolay M.   (2003-10-25 18:29) [32]


> А как можно применять авторизацию Windows?

Соединятсья с апп-сервером не через сокеты, а через DCOM.



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.011 c
14-75326
.Lex
2003-11-28 13:14
2003.12.23
Ксавье Пачеко: Borland Delphi 6(5). Руководство разработчика


14-75307
R
2003-11-28 02:47
2003.12.23
Расспространение программы за плату.


7-75414
plyaznik
2003-10-17 19:18
2003.12.23
подскажите по командной строке...


14-75322
Igit
2003-11-30 21:56
2003.12.23
А можно где нибудь MSDN скачать?


14-75373
BlackTiger
2003-11-28 19:22
2003.12.23
Анекдот про Матрицу (хорошего всем настроения)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский