Проверка подлинности с помощью форм на поддоменах
Можно ли аутентифицировать пользователей через субдомены, когда аутентификация происходит в субдомене, а не в родительском домене?
Например:
Пользователь заходит на сайт site1.parent.com, а затем нам нужно отправить его на report.parent.com.
Могу ли я аутентифицировать их на сайте отчетов, даже если вход произошел в поддомене?
До сих пор все исследования, которые я проводил, имели пользователей, вошедших сначала в родительский домен, а затем каждый поддомен имеет доступ к куки-файлу аутентификации.
7 ответов
Вы можете установить cookie как родительский домен во время аутентификации, но вы должны явно указать его, по умолчанию он будет использовать весь домен, на котором вы находитесь.
Как только файл cookie аутентификации правильно настроен для родительского домена, все субдомены должны быть в состоянии прочитать его.
Когда вы аутентифицируете пользователя, задайте для домена куки-файла аутентификации домен второго уровня, т.е. parent.com. Каждый поддомен будет получать куки-файлы родительского домена по запросу, поэтому аутентификация по каждому из них возможна, поскольку у вас будет общий куки-файл аутентификации для работы.
Код аутентификации:
System.Web.HttpCookie authcookie = System.Web.Security.FormsAuthentication.GetAuthCookie(UserName, False);
authcookie.Domain = "parent.com";
HttpResponse.AppendCookie(authcookie);
HttpResponse.Redirect(System.Web.Security.FormsAuthentication.GetRedirectUrl(UserName,
False));
В дополнение к настройке файла cookie для родительского домена также необходимо убедиться, что все сайты (приложения) имеют одинаковые validationKey и decryptionKey (), чтобы они все распознавали друг друга билет проверки подлинности и cookie. Довольно хорошая статья здесь http://www.codeproject.com/KB/aspnet/SingleSignon.aspx
В качестве примечания, я обнаружил, что после использования метода jro, который работал хорошо +1, метод FormsAuthenication.SignOut() не работал при вызове из субдомена, отличного от www/. (Я предполагаю, потому что свойство.Domain не совпадает) - Чтобы обойти это, я использовал:
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
HttpCookie myCookie = new HttpCookie(FormsAuthentication.FormsCookieName);
myCookie.Domain = "parent.com";
myCookie.Expires = DateTime.Now.AddDays(-1d);
Response.Cookies.Add(myCookie);
}
Ответ Джро работает отлично. Но не забудьте обновить аутентификацию форм webconfig setting "domain"
иначе формы проверки подлинности не будут работать должным образом. Вот проблема выхода, с которой я столкнулся. Хитрость здесь в том, чтобы иметь "." в качестве префикса в качестве домена для файла cookie задано ".parent.com" (используйте инспектор файлов cookie).
<authentication mode="Forms">
<forms cookieless="UseCookies" defaultUrl="~/Default" loginUrl="~/user/signin" domain=".parent.com" name="FormAuthentication" path="/"/>
</authentication>
Да, конечно. Возможно, на некоторых этапах вам придется бросить свои собственные, но это должно быть выполнимо.
Одна идея: когда вы перенаправляете их через границу, дайте им токен однократного прохода, а затем сообщите принимающему поддомену, чтобы он их ожидал (этот пользователь, с этого IP, с этим токеном).
2 вещи, которые нужно сделать:
- MachineKey должен быть одинаковым во всех файлах web.config (основной домен и дополнительный домен (ы))
- AuthenticationCookie доменное имя должно быть таким же.
Следуйте следующей статье для большей глубины.