AuthenticationForm – межсайтовые файлы cookie

У меня есть 2 веб-сайта, первый myFirst.domain.com, а второй mySecondSite.domain.com.

Они остаются на двух разных веб-серверах, и моя цель — разрешить межсайтовую аутентификацию (моей реальной потребностью является общий FormsAuthentication файл cookie).

Я правильно настроил свой файл web.config (узел машинного ключа, узел форм). Единственная разница заключается в loginUrl, где на myFirstSite отображается как ~/login.aspx, а на mySecondSite — как http://myFirstSite.com/login.aspx.

Обратите внимание, что у меня нет виртуального каталога, у меня всего 2 разных веб-приложения.

Проблема: когда я перехожу на страницу входа в myFirstSite с mySecondSite, меня никогда не перенаправляют со страницы входа, кажется, что файл cookie не записывается.

Ниже приводится несколько фрагментов по этой проблеме:

Мой первый сайт:

 <machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES" />
        <authentication mode="Forms">
            <forms loginUrl="login.aspx" name="authCookie" enableCrossAppRedirects="true"></forms>
        </authentication>
        <authorization>
            <deny users="?" />
            <allow users="*"/>
        </authorization>

Код MyFirstSite позади:

 FormsAuthenticationTicket fat = new FormsAuthenticationTicket(1, "userName..", DateTime.Now, DateTime.Now.AddMinutes(30), true, "roles..");

        string ticket = FormsAuthentication.Encrypt(fat);

        HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, ticket);
        authCookie.Expires = fat.Expiration;
        authCookie.Domain = "myDomain.com";
        Response.Cookies.Add(authCookie);

//Here is other stuff about querystring checking in order to execute exact redirect, however it's not working, I always return to the login page.

Мой второй сайт:

<machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES"/>
        <authentication mode="Forms">
            <forms loginUrl="http://myFirstSite.domain.com/login.aspx?queryStringToIndicateUrlPage" enableCrossAppRedirects="true"></forms>
        </authentication>
        <authorization>

Ну вот и все. К сожалению, это не работает.

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


person bit    schedule 03.09.2012    source источник


Ответы (1)


Поскольку вы используете аутентификацию на основе файлов cookie, совместно используемую двумя доменами, вам необходимо указать это в элементе <forms>:

<machineKey validationKey="..." decryptionKey="..." validation="SHA1" decryption="AES"/>
    <authentication mode="Forms">
        <forms domain=".domain.com" ... />
    </authentication>

Обратите внимание на начальную "." перед именем домена, что позволяет обмениваться файлами cookie между поддоменами.

person Ruben    schedule 03.09.2012
comment
Я уже пытался указать доменное имя, но это все равно не работает. - person bit; 04.09.2012
comment
@bit: в вашем примере кода используется authCookie.Domain = myDomain.com, это должно быть .myDomain.com. Вы пробовали это? - person Ruben; 04.09.2012
comment
Да, я сделал. Я пробовал и многие другие решения без везения. Это кажется невозможным. - person bit; 04.09.2012
comment
Важно: в моем примере я сказал myFirstSite.myDomain.com и mySecondSite.MyDomain.com для semplcity. На самом деле это адреса myFirstSite.xxx.yyy.com и mySecondSite.xxx.yyy.com, поэтому строка моего домена cookie будет .xxx.yyy.com. Я читал, что более 2 точек могут быть причиной плохой проблемы. Возможно ли это? - person bit; 04.09.2012
comment
@bit: Первое, что я бы проверил на вашем месте, это действительно ли файлы cookie сохраняются. Забудьте об аутентификации после этого, вы видите, что файлы cookie устанавливаются правильно? Посмотрите на заголовки Set-Cookie и Cookie с помощью сетевого трассировщика (он встроен в IE, вы можете использовать Firebug под Firefox). - person Ruben; 05.09.2012