Подтвердить что ты не робот

ASP.NET Subdomain Cookie (родительский и один поддомен)

У меня есть приложение с несколькими субдоменами, 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, если это имеет значение.

БЛАГОДАРЯ!

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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;

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

роберт