Как вы передаете аутентифицированный сеанс между доменами приложений

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

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

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

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


person Community    schedule 16.09.2008    source источник


Ответы (8)


Попробуйте использовать 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. Он рекомендует ответы, подобные приведенным выше, в дополнение к домашнему решению SSO.

person craigmoliver    schedule 16.09.2008
comment
Вам нужно написать какой-либо код на стороне http://otherapp/, или ASP.NET просто знает о форме POST, содержащей FormsCookieName? - person russau; 17.08.2011
comment
Чтобы ответить на мой собственный вопрос - да, ASP.NET просто знает, когда в сообщении появляется значение .ASPXAUTH. Это где-нибудь задокументировано? Это не упоминается в статье MSDN о EnableCrossAppRedirects msdn .microsoft.com/en-us/library/ - person russau; 17.08.2011
comment
.. и вы также можете передать значение FormsCookieName в строке запроса. - person russau; 17.08.2011

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

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

</authentication>

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

person Adam Pope    schedule 16.09.2008

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

person public static    schedule 16.09.2008

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

person Marc Gear    schedule 16.09.2008

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

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

person Matej    schedule 16.09.2008

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

  1. Купите коммерческий продукт SSO (например, SiteMinder или PingIdentity)
  2. Используйте междоменное решение Microsoft SSO, которое называется ADFS — Active Directory Federation. Услуги. (федерация — это термин для координации поведения нескольких доменов)

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

person Markc    schedule 16.09.2008

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

[1]: http://www.ja-sig.org/products/cas/ КАС

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

person Community    schedule 16.09.2008

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

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

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

person Toby Mills    schedule 16.09.2008
comment
Это звучит бесконечно взламываемо. - person Lucas Oman; 16.09.2008