#asp.net #forms-authentication #single-sign-on
#asp.net #формы-аутентификация #единый вход
Вопрос:
Я работаю над решением для единого входа для двоих ASP.NET Веб-сайты MVC3. Сайты находятся на отдельных поддоменах. Я использую аутентификацию в формах, и пока у меня все работает хорошо. Когда я вхожу в a.example.com Я автоматически вошел в b.example.com тоже. Неплохо.
Каждое приложение имеет свою собственную базу данных.
Мой вопрос заключается в следующем: если я хочу синхронизировать определенную пользовательскую информацию между двумя сайтами (скажем, дату последней активности или некоторые пользовательские настройки), то должен ли я иметь таблицу пользователей в обеих базах данных и каким-то образом синхронизировать их или должен только a.example.com в базе данных есть таблица пользователей и b.example.com каким-то образом читает и записывает в него?
Спасибо за ваш совет.
Редактировать: Благодаря Адаму я склоняюсь к хранению всех пользовательских данных в отдельной базе данных. Я передам имя пользователя и идентификатор аутентифицированного пользователя каждому приложению в файле cookie аутентификации. Кто-нибудь может дать какие-либо советы по поддержанию ссылочной целостности между двумя базами данных?
Ответ №1:
Большинство решений единого входа, которые я видел, имеют центральный accounts
портал, где пользователи могут поддерживать настройки, изменять адрес электронной почты и т.д.
Подумайте о Google:
- google.com/reader
- google.com/analytics
- google.com/accounts
Это представляет собой хранилище одного пользователя, обеспечивающее аутентификацию для нескольких сайтов. Это имеет различные преимущества, такие как единое место для хранения хэшей сеанса и других сведений о безопасности (для предотвращения таких вещей, как атаки «человек посередине»).
При истинном едином входе запрос на аутентификацию перенаправляется в центральную систему аутентификации (ie google.com/accounts ), аутентифицирует, а затем перенаправляет на службу, которая запросила аутентификацию.
Из вашего описания похоже, что у вас отдельная аутентификация для каждого сайта / службы, но база данных пользователя является общей.
Комментарии:
1. Спасибо, Адам — я должен был быть более ясным. Вся аутентификация происходит на a.example.com . b.example.com перенаправляет на a.example.com/logon ? referrer=b.example.com всякий раз, когда пользователю необходимо пройти аутентификацию. После аутентификации я проверяю значение ‘referrer’ и перенаправляю их обратно туда, откуда они пришли.
2. Мне нравится идея центрального портала / сайта «учетные записи», который заботится об аутентификации и пользовательских настройках и т.д. Вы предлагаете мне создать третью базу данных для хранения моих пользовательских данных, к которым может получить доступ каждый из других веб-сайтов?
3. Да — у нас есть центральная
sso
база данных сusers
таблицей. Затем у нас естьservices
таблица, описывающая каждую услугу (базовый URL и т.д.). Междуusers
иservices
существует таблица ссылок, которая включает соответствующие службы для каждого пользователя.4. Это звучит как отличная идея. Спасибо, Адам. Еще один вопрос, если можно — как насчет связей в a.example.com база данных (например, столбец UpdatedBy в таблице Company)? Должен ли я использовать идентификатор пользователя или имя пользователя для UpdatedBy (я могу легко получить имя пользователя из файла cookie авторизации)? Что происходит с отношениями, когда пользователь удаляется из базы данных единого входа?
5. Это зависит от ваших конкретных потребностей — на что я не могу ответить. Но хранить имя пользователя в файле cookie — плохая идея — храните соленый хэш. Если я ответил на ваш первоначальный вопрос, не могли бы вы принять его? Спасибо