Cookie субдомена ASP.NET (родительский и один поддомен) - PullRequest
11 голосов
/ 31 января 2010

У меня есть приложение с несколькими поддоменами: subone.parent.com, subtwo.parent.com.

У меня есть страница входа на сайте parent.com/login. Когда пользователь входит в систему, я перенаправляю его в соответствующий домен, в зависимости от того, членом которого он является. Это отлично работает.

FormsAuthenticationTicket ticket = new FormsAuth...
string encTicket = FormsAuthentication.Encrypt(ticket);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
cookie.Domain = subone.parent.com
Response.Cookies.Add(cookie)

Это правильно аутентифицирует пользователя для subone.parent.com, а не subtwo.parent.com. Однако я бы хотел сделать следующее.

Если пользователь возвращается на parent.com, я хотел бы знать, что они вошли в систему и перенаправить его обратно на subone.parent.com.

Есть ли лучшая практика для достижения этой цели? Или я должен установить другой файл cookie для parent.com?

Я работаю в asp.net mvc, если это имеет значение.

спасибо!

Ответы [ 3 ]

5 голосов
/ 01 февраля 2010

Вы можете обмениваться файлами cookie между доменами, как вы пытаетесь сделать, но это не так просто, пример здесь .

Другой вариант - установить для cookie-файла значение «.parent.com», а не указывать субдомен в явном виде и использовать куки-файлы для хранения сведений о субдомене. Затем вы можете получить доступ к cookie-файлу с любого из ваших субдоменов (и родительского, если он использует www.parent.com).

Если вы используете MVC, вы можете довольно легко создать собственный фильтр и добавить его на контроллеры www.parent.com, чтобы проверить наличие cookie, и, если это так, перенаправить на поддомен, который указывает cookie. Более подробная информация о фильтрах здесь .

0 голосов
/ 01 февраля 2010

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

void MasterPage_Unload(object sender, EventArgs e)
{
   ///ASP.NET uses one cookie per subdomain/domain,
   ///we need one cookie for _all_ subdomains.
   if (Context.Response.Cookies["ASP.NET_SessionId"] == null)
      return;

   var sessionCookie = new HttpCookie("ASP.NET_SessionId", Context.Session.SessionID);
   sessionCookie.Domain = ".yourdomain.com" ; 
   Context.Response.SetCookie(sessionCookie);
 }

внутри метода Page_Load:

 Unload += MasterPage_Unload;

отлично работает :-)

роберт

0 голосов
/ 01 февраля 2010

Я бы установил cookie для явного домена, как у вас там, потому что он хранит любую информацию о безопасности в cookie этого конкретного домена.Вы также можете добавить незашифрованный файл cookie на уровне * .parent.com, который содержит информацию о том, какие домены были аутентифицированы.Нет никакого реального способа связать это вместе, хотя без использования, возможно, временных меток и наличия логической связи между приложениями (то есть - sub2 имеет время ожидания сеанса 20 минут, поэтому, если в родительском куки-файле встречается доменная + действительная временная метка, она будет действительнойоднако это бизнес-логика).

Я не уверен, что причина разъединения между доменами, но вы можете предпочесть иметь один cookie, который содержит зашифрованный текст за зашифрованным текстом.EG:

1) Sub1 входит в систему, устанавливает cookie-файл parent.com как действительный.Отправляет часть пользовательских данных в веб-службу аутентификации.

2) Служба аутентификации распознает sub1 как отправителя, шифрует пользовательские данные и добавляет их в пользовательский объект cookie.

3) Пользовательский объект cookie создает составную строку с уникальным символом разделения (или последовательностью) и делает его доступным для метода службы.

4) Служба, используя шифрование форм, шифрует весь билет и отправляет его.вернуться к исходному логину.

Таким образом, каждый сервер сможет расшифровать глобальный тикет, но каждый фрагмент данных будет зашифрован с использованием общего алгоритма, но соль на основе сервера.Поэтому, если sub2 пытается прочитать данные cookie из sub1, он получает зашифрованную версию, а не необработанные данные.

...