|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
Не секрет что есть 100500 метод организации аутентификации и авторизации при юзинге WCF и каждая метода костыльнее другой. Основная метода предлагаемая мелкософтом (юзинг родного мембершипера ASP.NET) по мне так самая костыльная - кастомизировать очень проблематично, в реальных проектах чаще всего вызов метода WCF привязан к конкретному юзеру а не к роли. В базе как правило 100500 таблиц имеют связи с таблицей юзеров, что опять не комильфо в случае с мембершипером, да еще все это дело тормозит и переполнено функционалом 90% из которого не юзается в реальных проектах. Кастомных вариантов просто тьма, кто куки передает если биндинг по http, кто добавляет заголовки к SOAP с логинами/паролями/токенами и т.д... Года 3 назад, разбираясь со всем этим делом, забил на разные мембершиперы и тупо в каждый метод передаю гуид который генерю каждому юзеру при входе в ситему, типа того: Код: c# 1. 2. 3. 4. 5. 6.
В принципе меня все устраивает, уже несколько десятков приложений собрал по этой методе, все работает, никто ничего не взломал и не задосил. Но собственно вопрос - к каким методам Вы пришли и что используете в своих проектах? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2015, 20:41 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
По сути использую похожий подход. Сервисом пользуются внешние клиенты, которым выдается свой ID при регистрации. В каждый метод сервиса передается этот ID и подпись. Для подписи есть правила формирования- это MD5 хеш, полученный из склеивания строкового представления всех параметров+ пароль, который выдается пользователю при регистрации. На своей стороне делаю проверку, по ID клиента запрашиваю его пароль из своей таблицы. Так же склеиваю строку из пришедших прараметров+ пароль, получаю подпись и сравниваю с той, которая на входе. Если совпало- значит наш клиент ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 14:26 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
БерезовскийПо сути использую похожий подход. Сервисом пользуются внешние клиенты, которым выдается свой ID при регистрации. В каждый метод сервиса передается этот ID и подпись. Для подписи есть правила формирования- это MD5 хеш, полученный из склеивания строкового представления всех параметров+ пароль, который выдается пользователю при регистрации. На своей стороне делаю проверку, по ID клиента запрашиваю его пароль из своей таблицы. Так же склеиваю строку из пришедших прараметров+ пароль, получаю подпись и сравниваю с той, которая на входе. Если совпало- значит наш клиент Это круто. Я в сервисе для внутреннего пользования использую прямо имя пользователя, взятое из текущего логина - нет смысла шифровать. Но смысл тот же - имя влияет на то, что конкретному юзеру сервер отдает. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2015, 16:32 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIНо собственно вопрос - к каким методам Вы пришли и что используете в своих проектах? Мы используем федеративную аутентификацию. Это добавляет сложностей с развертыванием, но дает и свои преимущества. Все делается на базе WIF (сейчас это часть .Net Framework). Его же [WIF] средствами, мы проверяем и credentials клиента на сервисе токенов. Что касается вашего вопроса, то я немного не уловил его суть - в чем именно состоит "костыльность" стандартных аутентификационных методов? Собственно, базовый WCF предлагает ровно 4 типа credentials, которые вы можете передать с клиента: - Windows . Передается некая крипто-функция на основе доменного аккаунта и пароля. Работает в рамках домена и для доменных пользователей (т.е. можно обращаться и извне, но пользователь все равно доменный). - User/Password . Передается сам пароль. Требуется защищенный канал (хоть на уровне транспорта, хоть на уровне сообщений). Для проверки можно использовать или Windows Security (тогда это мало отличается от первого варианта), или ASP.Net Membership Provider о котором вы упомянули или Custom UserName/Password validator. Последний прост как 3 рубля - там 1 метод с именем и паролем и все... - Certificate . Передается открытая часть сертификата + образец подписи, который подтверждает наличие у вас закрытого ключа (чуть сложнее, на самом деле, но суть примерно такая). Обычно такой метод используют для аутентификации сервис-сервис, но можно аутентифицировать и пользователей (тогда нужно просто иметь механизм сопоставления "сертификат - пользователь"). Я правда использовал этот вариант только для аутентификации сервисов, но помню, что есть готовый механизм маппинга сертификатов на Windows-аккаунты. - Issued token . Собственно это и есть основа для федеративной аутентификации, когда вы у некоего сервиса получаете токен, а затем уже им пользуетесь для обращения ко всем остальным. Вроде все достаточно просто и понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 08:44 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIВ принципе меня все устраивает, уже несколько десятков приложений собрал по этой методе, все работает, никто ничего не взломал и не задосил. Я не знаю, как именно вы генерируете Guid, надеюсь, вы не используете для этого стандартный Guid-генератор, (тот который Guid.NewGuid()). Ибо последний - вещь сугубо детерминированная и абсолютно неслучайная. Подобрать её не составит труда. Еще я очень надеюсь, что вы контролируете время сессии, т.е. время жизни вашего accessKey, потому что в противном случае, подбор действующих сессий резко упрощается. Ну а так, вы просто создали свою реализацию механизма сессий. Чем она лучше стандартных я не берусь судить. Может и лучше... Единственное, я бы все же доработал слегка этот механизм и передавал бы этот Id сессии неявно (хотя может у вас так и сделано, а сигнатуру с явным Guid вы привели просто для понимания идеи - тогда предложение снимается). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 08:52 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
МихаилРЯ не знаю, как именно вы генерируете Guid, надеюсь, вы не используете для этого стандартный Guid-генератор, (тот который Guid.NewGuid()). Да, именно тот который Guid.NewGuid() если логика на апп-сервере или newid() если на sql-сервере. МихаилРИбо последний - вещь сугубо детерминированная и абсолютно неслучайная. Подобрать её не составит труда. Можете показать мастер-класс по подбору детерминированного гуида? А то шума в сети по этому поводу много, а подобрать желающих мало. МихаилРЕще я очень надеюсь, что вы контролируете время сессии, т.е. время жизни вашего accessKey, потому что в противном случае, подбор действующих сессий резко упрощается. Да, конечно. МихаилРЕдинственное, я бы все же доработал слегка этот механизм и передавал бы этот Id сессии неявно (хотя может у вас так и сделано, а сигнатуру с явным Guid вы привели просто для понимания идеи - тогда предложение снимается). Если честно, то передаю явно, но полностью с Вами согласен - надо передавать как-то не явно, просто переделывать работающие приложения нет резона, буду делать что-то новое обязательно в хидеры куда-то засуну. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 09:39 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
EDUARD SAPOTSKIМожете показать мастер-класс по подбору детерминированного гуида? А то шума в сети по этому поводу много, а подобрать желающих мало. Да, вы правы - мои знания о природе GUID несколько устарели. На текущий момент от инкрементального GUID Microsoft отказались и используют pseudo random реализацию. На сколько она устойчива к подбору, судить не берусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2015, 10:10 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
МихаилРEDUARD SAPOTSKIМожете показать мастер-класс по подбору детерминированного гуида? А то шума в сети по этому поводу много, а подобрать желающих мало. Да, вы правы - мои знания о природе GUID несколько устарели. На текущий момент от инкрементального GUID Microsoft отказались и используют pseudo random реализацию. На сколько она устойчива к подбору, судить не берусь. все зависит от цены вопроса ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2015, 11:22 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
>EDUARD SAPOTSKI, 10 фев 15, 20:41 [17246856] >Но собственно вопрос - к каким методам Вы пришли и что используете в своих проектах? Посмотри здесь . Есть и GUID и компрессия и шифрование. И маленькое прибавление: Крипто. Жизнь не стоит на месте. У некоторых появилась возможность хранить весь трафик сессии взаимодействия <клиент,сервер приложений> в надежде получить старый закрытый ключ сервера и дешифрировать. В среде прототипа попытаемся закрыть эту брешь. Сделаем так (предложение): 1. клиент строит временную пару асимметричного алгоритма (нужна только для получения сессионного симметричного ключа), включающую открытый_ключ_клиента(окк) 2. клиент строит guid_обмена_ключами (g_ок) 3. клиент строит модифицированный_открытый_ключ_клиента(мокк) = mod2(окк,g_ок) 4. клиент шифрует <g_ок> открытым ключом сервера, добавляет мокк, передаёт пакет серверу 5. сервер получает пакет, восстанавливает g_ок и окк 6. сервер формирует сессионный_симметричный_ключ(сск), сессионный_mod2(md2) и guid_виртуальной_сессии(g_вс) 7. сервер шифрует <сск,md2> посредством окк, добавляет g_вс и пакет передает клиенту. 8. клиент восстанавливает сск и md2, теперь сервер и клиент имеют сск, md2, g_вс. 9. клиент передает серверу в рамках сессии хэши <Имя,Пароль>. Если ок, то виртуальная сессия становится реальной, иначе уничтожается С уважением, Владимир. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2015, 11:57 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
ВМоисеевИ маленькое прибавление: Крипто. Жизнь не стоит на месте. У некоторых появилась возможность хранить весь трафик сессии взаимодействия <клиент,сервер приложений> в надежде получить старый закрытый ключ сервера и дешифрировать. В среде прототипа попытаемся закрыть эту брешь. Сделаем так (предложение): 1. клиент строит временную пару асимметричного алгоритма (нужна только для получения сессионного симметричного ключа), включающую открытый_ключ_клиента(окк) 2. клиент строит guid_обмена_ключами (g_ок) 3. клиент строит модифицированный_открытый_ключ_клиента(мокк) = mod2(окк,g_ок) 4. клиент шифрует <g_ок> открытым ключом сервера, добавляет мокк, передаёт пакет серверу 5. сервер получает пакет, восстанавливает g_ок и окк 6. сервер формирует сессионный_симметричный_ключ(сск), сессионный_mod2(md2) и guid_виртуальной_сессии(g_вс) 7. сервер шифрует <сск,md2> посредством окк, добавляет g_вс и пакет передает клиенту. 8. клиент восстанавливает сск и md2, теперь сервер и клиент имеют сск, md2, g_вс. 9. клиент передает серверу в рамках сессии хэши <Имя,Пароль>. Если ок, то виртуальная сессия становится реальной, иначе уничтожается Все это конечно интересно, но есть мнение(с которым я солидарен), что чем проще - тем надежнее и лучше. С таким длинным алгоритмом выстрелить себе в ногу думаю более чем реально. ВМоисеевПосмотри здесь . Есть и GUID и компрессия и шифрование. Ссылка, как понял, нитуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2015, 12:13 |
|
И снова аутентификация и авторизация...
|
|||
---|---|---|---|
#18+
>EDUARD SAPOTSKI, сегодня, 12:13 [17301151] >Ссылка, как понял, нитуда. Извините, это здесь . С уважением, Владимир. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2015, 14:18 |
|
|
start [/forum/topic.php?fid=19&msg=38885571&tid=1396900]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 137ms |
0 / 0 |