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

StackOverflow https://stackoverflow.com/questions/72125

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Сгенерируйте машинный ключ.Пример: Самый простой способ сгенерировать MachineKey – Советы и рекомендации:АСП.НЕТ, 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 этого руководства. книга от Врокса.Он рекомендует ответы, подобные приведенным выше, в дополнение к предоставлению домашнего решения SSO.

Другие советы

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

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

</authentication>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top