Проверка подлинности с помощью форм на поддоменах - PullRequest
26 голосов
/ 03 марта 2009

Можно ли аутентифицировать пользователей через субдомены, когда аутентификация происходит в субдомене, а не в родительском домене?

Например:

Пользователь заходит на сайт site1.parent.com, а затем нам нужно отправить его на reports.parent.com.

Могу ли я аутентифицировать их на сайте отчетов, даже если вход произошел на поддомене?

До настоящего времени все мои исследования касались того, что пользователи сначала заходили в родительский домен, а затем каждый поддомен имел доступ к файлу аутентификации.

Ответы [ 7 ]

29 голосов
/ 04 марта 2009

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

Код аутентификации:

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));
10 голосов
/ 04 марта 2009

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

Как только файл cookie аутентификации правильно настроен для родительского домена, все субдомены должны быть в состоянии прочитать его.

7 голосов
/ 24 июня 2011

В дополнение к настройке cookie для родительского домена также необходимо убедиться, что все сайты (приложения) имеют одинаковые validationKey и decryptionKey (), чтобы они все распознавали друг друга билет аутентификации и cookie. Довольно хорошая статья здесь http://www.codeproject.com/KB/aspnet/SingleSignon.aspx

7 голосов
/ 02 июля 2010

В качестве дополнительного примечания я обнаружил, что после использования метода 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);
            }
4 голосов
/ 19 июня 2015

Ответ Джро работает отлично. Но не забудьте обновить аутентификацию форм 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>
4 голосов
/ 03 марта 2009

Да, конечно. Возможно, на некоторых этапах вам придется бросить свои собственные, но это должно быть выполнимо.

Одна идея: когда вы перенаправляете их через границу, дайте им токен однократного прохода, а затем сообщите принимающему поддомену, чтобы он их ожидал (этот пользователь, с этого IP, с этим токеном).

3 голосов
/ 03 октября 2012

2 вещи, которые нужно сделать:

  1. MachineKey должен быть одинаковым во всех файлах web.config (основной домен и поддомен (ы))
  2. AuthenticationCookie доменное имя должно быть таким же.

Следуйте статье , следующей за , для большей глубины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...