2008-09-16 3 views
9

Допустим, у вас есть сайты www.xyz.com и www.abc.com.Как пройти аутентифицированную сессию между доменами приложений

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

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

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

ответ

5

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

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

Генерация ключа машины. Пример: Easiest way to generate MachineKey – Tips and tricks: 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 это book от Wrox. Он рекомендует ответы, подобные приведенным выше, помимо предоставления решения SSO доморощенного.

+0

Вам нужно написать любой код на стороне `http: // otherapp /`, или ASP.NET «просто знает» о форме POST, содержащей FormsCookieName? – russau 2011-08-16 22:51:51

0

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

0

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

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

1

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

2

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

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

</authentication> 

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

0

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

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

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

-1

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

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

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

+0

Это звучит бесконечно взломанно. – 2008-09-16 14:51:52

0

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

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

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

Смежные вопросы