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, если это имеет значение.
БЛАГОДАРЯ!
Ответы
Ответ 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;
он отлично работает:-)
роберт