SSO через разные домены - PullRequest
       22

SSO через разные домены

2 голосов
/ 24 февраля 2009

Как я могу реализовать единый вход в домены? У меня есть два или более доменов, и я хочу, чтобы все они проходили аутентификацию через один сервер с использованием SqlMembershipProvider (база данных членства ASP.NET 2.0) У меня есть домен foo.com, на котором размещена база данных о членстве asp.net, и другой домен bar.com, который хочет пройти аутентификацию через foo.com. Я нашел много статей в Интернете для разных приложений, но в одном и том же домене, но в разных доменах я не нашел полной статьи, описывающей цикл, я видел некоторые, использующие класс FormsAuthenticationTicket или класс FormsAuthentication Я знаю, что machineKey в web.config должен быть таким же. Я думал, что это легко, если позволить foo.com, после того как он будет аутентифицирован, просто скопировать cookie-файл аутентификации и изменить домен cookie-файла с foo.com на bar.com, но я понял, что не могу контролировать куки-файлы других доменов! Так есть ли способ заставить его работать?

Спасибо и всего наилучшего, Ahmed

1 Ответ

1 голос
/ 24 февраля 2009

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

Для работы с настройками ASP.NET web.config, которые разрешают анонимный доступ или требуют входа пользователя, необходимо создать модуль, который перехватывает HttpApplication.EndRequest и проверяет ошибку HTTP 401 (это означает, что необходима аутентификация).
Сбросьте код ошибки и перенаправьте на свой сайт единого входа. Здесь вы можете войти как обычно.

Теперь начинается самое сложное: вам нужно передать учетные данные пользователя по сети на другой сервер безопасным способом. Это можно сделать с помощью симметричного шифрования и общего секрета или путем обмена секретом с асимметричным шифрованием.

Модуль HttpModule на другой стороне теперь получает перенаправление назад с сайта входа в систему, проверяет, действителен ли вход в систему, и заменяет HttpContext.User (обязательно инкапсулируйте существующего пользователя, если он есть, так что вы можете направьте вызов IsInRole на этот IPrincipal).

...