Проблема кроссдоменной авторизации

rudevelop

Есть два сервера. На первом установлен iis 7.0 и заведены несколько разных сайтов sub1.domain.ru, sub2.domain.ru, sub2.domain.ruна сайтах настроена кроссдоменная авторизация:
.....
<authentication <span>mode</span><span>="Forms"</span>>
 <forms <span>cookieless</span><span>="UseCookies"</span> <span>defaultUrl</span><span>="/"</span> <span>loginUrl</span><span>="/"</span> <span>protection</span><span>="All"</span> <span>domain</span><span>=".domain.ru"</span> <span>enableCrossAppRedirects</span><span>="true"</span> <span>timeout</span><span>="30000"</span> />
</authentication>
<membership <span>defaultProvider</span><span>="MyProvider"</span> <span>hashAlgorithmType</span><span>="SHA1"</span>>
 <providers>
 <add <span>name</span><span>="MyProvider"</span> <span>type</span><span>="System.Web.Security.SqlMembershipProvider"</span>
 <span>minRequiredNonalphanumericCharacters</span><span>="0"</span> <span>minRequiredPasswordLength</span><span>="6"</span>
 <span>connectionStringName</span><span>="connectionStringName"</span>
 <span>applicationName</span><span>="applicationName"</span> <span>enablePasswordRetrieval</span><span>="false"</span> 
 <span>enablePasswordReset</span><span>="true"</span> <span>requiresQuestionAndAnswer</span><span>="false"</span> <span>requiresUniqueEmail</span><span>="true"</span> <span>passwordFormat</span><span>="Hashed"</span> />
 </providers>
</membership>
 <machineKey <span>validationKey</span><span>="validationKey"</span> <span>decryptionKey</span><span>="decryptionKey"</span> <span>validation</span><span>="SHA1"</span> <span>decryption</span><span>="AES"</span> />
....
между этими сайтам авторизация отлично работает при переходе с домена на домен.На втором сервере iis 7.5 и размещен сайт с доменами www.domain.ru и domain.ru Соответственно те же настройки в конфиге.Проблема в том что если авторизоваться на сайте domain.ru, то на sub1.domain.ru и других доменах авторизационная кука не читается и сайт пишет что пользователь не авторизован.В чем может быть проблема? И как ее можно решить?
12 ответов

rudevelop

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


rudevelop

И еще чем хорош SSO: тем, что нам не обязательно делать подсайты в sub доменах. Натравливаем SSO на любой сайт и всё у нас отлично работает.


rudevelop

МСУ, спасибо за совет. Но на реализацию нужно время. А сейчас нужно поправить работающий проект.Проблема кстати сузиалась до следующей:После авторизации пишется авторизационная кука .ASPXAUTH c доменом .domain.ruЕсли она была создана на одном сервере, то для сайтов, работающих на этом сервере, она читается. А на другом сервере эту куку не видно. Ее нет в Request.Cookies. Хотя ff, например, показывает эту куку доступную для данного сайта.Как это может быть?


rudevelop

...Как это может быть?
На то они и кукисы, чтобы были не видны в другом домене.


rudevelop

ShSerge,корневой домен то один domain.ru В обычном варианте кука с доменом .domain.ru читается как на domain.ru так и на sub1.domain.ru и тпА вот в моем случает кука есть, читатется на доменах sub1.domain.ru, sub2.domain.ru, sub3.domain.ru и по идее должна читаться на domain.ru, но нет же.


rudevelop

rudevelop,в последних версиях нета вроде как читал майкрософт чтото сделала в этом направлениипоищите - точно помню читал что вроде как реализовали в 4й версии полноценную реализации ССО для асп.нет


rudevelop

1. Укажите domain без точки в самом начале2. Forms Authentication Across Applications


rudevelop

SanSYS, спасибо. С этой статьи начинал. Дальше уже пробовал различные варианты.Но сейчас не об этом. Итак для всех кому интересно - решение моей проблемы.Оказывается FormsAuthentication.Decrypt() возвращает null, если тикет был зашифрован на другом сервере. А тикет это и есть авторизационная кука. Лечится путем установления следующего патча на всех серверах http://support.microsoft.com/kb/2656351Нашел в одном из блогов. Ссылка на первоисточник


rudevelop

rudevelop,хм.. а попробуй, интересу ради, machineKey"decryptionKey - Задает ключ для шифрования и расшифровки данных или процесс, в ходе которого создается ключ. Этот атрибут используется для шифрования и расшифровки при проверке подлинности форм, а также для шифрования состояния отображения и расшифровки состояния отображения, если оно зашифровано."на сколько понимаю - как раз его можно определить одинаковым значением в ваших приложениях (ну конечно же и остальные параметры)


rudevelop

SanSYS, естественно, machine key у меня в конфигах были одинаковые. Проблема была в том, что одинаковые machine key на разных серверах не могли прочитать то, что и было зашифровано с помощью этих самых ключей. Шифруется на одном сервере, и не читается на другом. Оказалось это баг в framework 4, который лечится с помощью патча.Сейчас у меня все работает.


rudevelop

rudevelop,точно, как-то проглядел в первом сообщении


rudevelop

Кстати, может кому пригодиться: