Как вы проходите аутентифицированную сессию между доменами приложений - PullRequest
9 голосов
/ 16 сентября 2008

Допустим, у вас есть веб-сайты www.xyz.com и www.abc.com.

Допустим, пользователь заходит на www.abc.com и проходит проверку подлинности через обычного поставщика членства ASP .NET.

Затем с этого сайта они отправляются (перенаправление, связаны, что угодно) на сайт www.xyz.com, и целью сайта www.abc.com было передать этого пользователя другому сайту в качестве статуса. isAuthenticated, так что сайт www.xyz.com больше не запрашивает учетные данные указанного пользователя.

Что нужно для того, чтобы это работало? У меня есть некоторые ограничения на это, хотя пользовательские базы данных полностью отделены, они не являются внутренними для организации, во всех отношениях это похоже на переход от stackoverflow.com к google с проверкой подлинности, это такая отдельная природа. Достаточно ссылки на соответствующую статью.

Ответы [ 8 ]

5 голосов
/ 16 сентября 2008

Попробуйте использовать FormAuthentication, установив раздел аутентификации web.config следующим образом:

<authentication mode="Forms">
  <forms name=".ASPXAUTH" requireSSL="true" 
      protection="All" 
      enableCrossAppRedirects="true" />
</authentication>

Сгенерируйте машинный ключ. Пример: Самый простой способ создания MachineKey - Советы и рекомендации: ASP.NET, IIS ...

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

.aspx:

<form id="form1" runat="server">
  <div>
    <p><asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://otherapp/" /></p>
    <input id="hdnStreetCred" runat="server" type="hidden" />
  </div>
</form>

код-за:

protected void Page_Load(object sender, EventArgs e)
{
    FormsIdentity cIdentity = Page.User.Identity as FormsIdentity;
    if (cIdentity != null)
    {
        this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName;
        this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket);
    }
}

Также см. Раздел «Аутентификация в форме кросс-приложения» в главе 5 этой книги от Wrox. Он рекомендует ответы, подобные приведенным выше, в дополнение к предоставлению решения для единого дома.

2 голосов
/ 16 сентября 2008

Если вы используете встроенную систему членства, вы можете выполнять кросс-доменную аутентификацию с аутентификацией форм, используя подобные в каждом файле web.config.

<authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" path="/" 
                  protection="All" 
                  domain="datasharp.co.uk" 
                  enableCrossAppRedirects="true" />

</authentication>

Убедитесь, что имя, путь, защита и домен одинаковы во всех файлах web.configs. Если сайты находятся на разных компьютерах, вам также необходимо убедиться, что ключи machineKey, проверки и шифрования совпадают.

1 голос
/ 16 сентября 2008

Если вы сохраняете сеансы пользователей в базе данных, вы можете просто проверить наличие Guid в таблице сеансов, если он существует, то пользователь уже прошел аутентификацию в другом домене. Чтобы это работало, вам нужно будет включить идентификатор сеанса в URL, когда вы перенаправляете пользователя на другой веб-сайт.

0 голосов
/ 16 сентября 2008

Я бы использовал что-то вроде CAS:

[1]: http://www.ja -sig.org / products / cas / CAS

Это решенная проблема, и я бы не советовал делать это самостоятельно.

0 голосов
/ 16 сентября 2008

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

Поместите однопиксельное изображение (веб-маяк) на сайт A, который будет вызывать сайт B, проходящий через идентификатор пользователя (зашифрованный и с отметкой времени). После этого будет создан новый сеанс пользователя на сайте B для пользователя, который будет установлен как зарегистрированный. Затем, когда пользователь посетит сайт B, он уже будет зарегистрирован.

Чтобы свести к минимуму звонки, вы можете разместить веб-маяк только на главной странице или войти на страницы подтверждения. Я успешно использовал это в прошлом для передачи информации между партнерскими сайтами.

0 голосов
/ 16 сентября 2008

Существует несколько подходов к этой проблеме, которая описывается как «междоменная единая регистрация». Статья в Википедии, на которую указывает Матеж, особенно полезна, если вы ищете решение с открытым исходным кодом - однако - в среде Windows, я полагаю, вам лучше использовать один из 2 подходов:

  1. Покупка коммерческого продукта SSO (например, SiteMinder или PingIdentity)
  2. Используйте междоменное решение SSO от MicroSoft, которое называется ADFS - Службы федерации Active Direcctory. (федерация - это термин для координации поведения нескольких доменов)

Я использовал SiteMinder, и он работает хорошо, но это дорого. Если вы находитесь в среде MicroSoft, я думаю, ADFS - ваш лучший выбор. Начните с этого документа ADFS .

0 голосов
/ 16 сентября 2008

Разрешение зависит от типа приложения и среды, в которой оно работает. Например. в интрасети с доменом NT вы можете использовать NTLM для передачи учетных данных Windows непосредственно серверам по периметру интрасети без необходимости дублирования сеансов.

Подход, как это сделать, обычно называется единый вход (см. Википедия ).

0 голосов
/ 16 сентября 2008

Не уверен, что бы вы использовали для .NET, но обычно я бы использовал memcached в стеке LAMP.

...