Единый вход — разделить таблицу одного пользователя между несколькими веб-сайтами или каким-то образом синхронизировать таблицы нескольких пользователей?

#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 — плохая идея — храните соленый хэш. Если я ответил на ваш первоначальный вопрос, не могли бы вы принять его? Спасибо