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

Вниз

Ограничение доступа к COM+ компонентам   Найти похожие ветки 

 
Genry   (2006-05-03 15:06) [0]

Доброго всем времени суток!
Есть приложение, работающее в трехзвенной архитектуре с использованием DataSnap
Серверные библиотеки под COM+, каждая на базе TMTSDataModule.
Вопрос заключается в следующем: возможно ли каким-то образом исключить прямое обращение к серверным компонентам? Скажем, некий юзер имеет права на запуск COM+ компонент. Нужно сделать так чтоб этот юзер смог реально с ними работать только из клиентской части приложения, предварительно пройдя авторизацию. Если он попытается самостоятельно вызвать какие-то методы (не из клиентского приложения)- получит ошибку.
Интересуют идеи, как это можно реализовать (если вобще можно), пускай даже если это будет связано со значительной переработкой серверной части.

Заранее спасибо!


 
Ломброзо ©   (2006-05-05 01:41) [1]

разве что только если смастерить самопальную систему аутентификации и авторизации наподобие веб-систем. То бишь:
- клиент успешно аутентифицируется логином/паролем
- сервер генерирует некую случайную переменную, сохраняет её у себя и отдает клиенту (аналог cookie)
- клиент передает квиток (cookie) во все методы серверных объектов, сервер проверяет квиток и авторизует клиента, или же не автоизует, если квиток передан пустой, невалидный или устаревший.

Вообще не стоит огород городить. COM+ -это stateless объекты, а безопасность при работе с ними обеспечивается встроенными средстами OC.


 
Genry   (2006-05-05 12:07) [2]


> Ломброзо ©   (05.05.06 01:41) [1]


> разве что только если смастерить самопальную систему аутентификации


Спасибо, мне как раз именно такая идея и пришла в голову.


> Вообще не стоит огород городить. COM+ -это stateless объекты,

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


> а безопасность при работе с ними обеспечивается встроенными
> средстами OC.

Ну да, ограничение на уровне юзера, но кое-кто хочет чтоб этот юзер не мог вызвать методы компонент НЕ из задачи, а того ОС кажется не дает таких возможностей...


 
Ломброзо ©   (2006-05-05 12:38) [3]

>Почему же, это от настроек зависит, может быть stateless,
>может быть и statefull

В том-то и дело, что если мудрить с тонкими настройками, то все преимущества COM+ по сравнению с DCOM теряют смысл. Eсли отключить пулинг, то теоретически можно держать ссылку на COM+ объект сколь угодно долго, не опасаясь того, что сервер при очередном обращении не подсунет не используемый объект из пула, но я в этом не уверен :) Поищите в спецификации COM+ гарантии такого поведения.

* * *
По сабжу пришла в голову ещё одна идейка.
Предлагаю сделать вот что:
1) Создать компонент, осуществляющий аутентификацию пользователя, с единственным методом, ну например, Login
void Login([in] BSTR userId, [in] BSTR password);

2) В базе данных смастерить табличку
DomainLogonName (к примеру, DOMAIN\ivanov)
UserId (например, ivanov)
Password
LastLogonTime
LoggedIn

3) Включить для приложения принудительную проверку доступа (настройка приложения->Вкладка "Безопасность" и опцию "Проверка доступа на уровне приложения и компонента", то есть - делаем доступным контекст вызова безопасности COM+
4) В момент вызова пользователем метода Login нужно получить его Account Name из контекста безопасности и при успешной аутентификации записать в табличку время аутентификации (LastLogonTime) и признак того, что аутентификация выполнена (LoggedIn).

То есть, перед началом работы каждый пользователь должен пройти аутентификацию, а квитком в этом случае служит имя его учётной записи, всегда доступная из контекста безопасности COM+, если включены соотв. опции в настройках приложения.

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


 
Genry   (2006-05-05 13:09) [4]


> что текущий пользователь прошёл аутентификацию и его сессия
> не завершилась по тайм-ауту.


Хм... идейка-то отличная, но тут есть тонкий момент: в таблице нужно отслеживать не только логин, но и логаут, чтобы понять что пользователь вышел из системы. Тогда как быть со случаем, когда произошел, скажем, разрывом соединения? В таблице останется запись о логине и всё...


> Eсли отключить пулинг, то теоретически можно держать ссылку
> на COM+ объект сколь угодно долго

Ну, я вобще-то говорил об отключении активации Just-in-time, тогда объект не пересоздается и способен сохранять свое состояние в течение всей коннекции к нему... или я ошибаюсь?


 
Genry   (2006-05-05 13:28) [5]

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


 
Ломброзо ©   (2006-05-05 13:31) [6]

Лог-аут отслеживать не нужно, зачем? Я считаю, что программирование под COM+ во многом схоже с программированием под Web, поэтому все паттерны в принципе можно заимствовать оттуда. В Web существует понятие сессии и её времени жизни (час, сутки и т.д.), поэтому пока сессия жива, клиент работает, сессия истекла - добро пожаловать на повторную аутентификацию, а отслеживать логауты в многозвенках не правильно в принципе, и тем более в тех многозвенках, где соединение с сервером не постоянно.

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

> Eсли отключить пулинг, то теоретически можно держать ссылку
> на COM+ объект сколь угодно долго
Ну да, я имел в виду отключить и пулинг, и JIT.


 
Ломброзо ©   (2006-05-05 13:33) [7]

Genry   (05.05.06 13:28) [5]

Ну тогда остается только первый вариант, с квитком, гоняемым между клиентом и сервером.


 
Genry   (2006-05-05 13:51) [8]


> а отслеживать логауты в многозвенках не правильно в принципе,
>  и тем более в тех многозвенках, где соединение с сервером
> не постоянно.

Хм... а как, имея запись о последнем логине определить, нужна ли пользователю повторная аутентификация или нет?
Т.е. допустим активируется серверный объект, получает запись о последнем логине данного юзера, к примеру она была 2 часа назад, как понять, нужно ли заново логиниться или нет?


> Ломброзо ©   (05.05.06 13:33) [7]


> Ну тогда остается только первый вариант

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


 
Ломброзо ©   (2006-05-05 14:03) [9]

>Genry   (05.05.06 13:51) [8]

Определить гд-нибудь продолжительность сессии, к примеру, 15 минут.
Далее несложная математика:
LogonTime = 10:00
SessionExpired = 10:15

если пользователь обратился, к примеру, в 10:12, то сессия не устарела, и в этом случае её можно продлить ещё на 15 минут (при необходимости можно перегенерировать квиток), а если в 10:16 - то заставить пройти аутентификацию повторно.

Насчёт трояна - отчего бы не посылать на сервер вместе с логином и паролем идентификатор клиентского процесса, работающего с сервером и проверять его тоже?


 
Genry   (2006-05-05 14:47) [10]


> Ломброзо ©   (05.05.06 14:03) [9]


> Определить гд-нибудь продолжительность сессии, к примеру,
>  15 минут.

Теперь понятно. Примерно так как сделано на некоторых веб-сайтах. Залогинился, если не дергаешь никакие ссылки в течении нек-рого времени - тебя просят повторно перелогиниться.
Тоже хороший вариант :-)


> Насчёт трояна - отчего бы не посылать на сервер вместе с
> логином и паролем идентификатор клиентского процесса, работающего
> с сервером и проверять его тоже?


Чесно говоря я вначале надеялся, что идентификатор клиентского процесса можно каким-то образом получить изнутри серверного объекта (подобно имени аккаунта), но ничего такого не нашел. Так бы конечно можно было бы прям из объекта привязаться к имени клиентского приложения, это было бы очень неплохо...
Ну а если реализовать обмен квитками, то есть ли смысл передавать еще и ID процесса?



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

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

Наверх





Память: 0.49 MB
Время: 0.035 c
3-1199532014
DeadMeat
2008-01-05 14:20
2008.06.08
Постоянные обрывы связи.


2-1210787964
Rustam01
2008-05-14 21:59
2008.06.08
курсор в memo


15-1208941969
ekto
2008-04-23 13:12
2008.06.08
В MySQL 5 нет StoredProc?


4-1190191771
AlexEgorov
2007-09-19 12:49
2008.06.08
Кто-нибудь знает, как удалить подключение к IPP принтеру?


2-1210784396
DJ_UZer
2008-05-14 20:59
2008.06.08
Зарегитрировать файл





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский