2010-01-13 4 views
25

У меня есть два домена domain1.com и domain2.com, указывающие на тот же сайт asp.net, который использует сборку asp.net в форме аутентификации. Проблема в том, что даже если домены указывают на один и тот же сайт, пользователь получает только аутентификацию только для одного домена за раз. Поэтому, если он сначала использует сайт www.domain1.com, а затем посещает www.domain2.com, это тот же веб-сайт в обратном, но он только аутентифицирован для www.domain1.com. То же самое происходит, если он использует www, а не www при посещении сайтов.Аутентификация форм и множественных доменов Asp.net

Это то, что я использую для входа:

FormsAuthentication.RedirectFromLoginPage(username, cookie.Checked); 

Чтобы проверить логин:

User.Identity.IsAuthenticated 

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

+0

аутентификации печенье, как и большинство куки, которые хранятся в домене, чтобы избежать междоменное pollenation и олицетворения. Зачем вам это делать? – Lazarus

+3

Потому что иногда у вас есть несколько сайтов, которые вы хотите, чтобы пользователь мог беспрепятственно пользоваться, без необходимости входить в каждый отдельно. –

+0

Почему бы вам не следовать методологии StackOverflow и использовать внешний поставщик проверки подлинности, такой как OpenID. – Lazarus

ответ

44

Что вы используете, это решение для единого входа.

Как аутентификации ASP.NET находится на его основе обычно Cookie основе, есть две вещи, чтобы посмотреть на:

  1. Установить куки правильно.
  2. Откажитесь от своих пользователей в альтернативный домен во время регистрации.

Глядя на обоих из них более подробно:

1. Установка печеньем правильно

Вы должны убедиться, что ASP.NET пишет печенье билет проверки подлинности корневого домена, а чем явный домен это делается с помощью атрибута формы элемента domain:

<forms 
    name="name" 
    loginUrl="URL" 
    defaultUrl="URL" 
    domain=".example.com"> 
</forms> 

Вам необходимо установить домен на .example.com "- обратите внимание на ведущий период - это ключ. Таким образом, запросы на example.com и www.example.com будут как правильно читать cookie, так и аутентифицировать пользователя.

2. Отказов пользователей на альтернативный домен

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

Это перенаправление на стороне клиента имеет важное значение - файлы cookie записываются только тогда, когда на клиент возвращается ответ, и браузер должен посетить второй домен, чтобы фактически просмотреть файлы cookie.

Других деталей рассмотреть в таком роде приборы:

  1. Вы, вероятно, хотите иметь тайм-аут на зашифрованный входе в деталях - так, чтобы напомнить, что URL из истории браузера автоматически не войдите в систему.
  2. Если домены находятся на разных серверах, вам необходимо убедиться, что либо машинные ключи настроены одинаково, чтобы вы могли правильно шифровать и дешифровать данные, либо использовать какой-либо другой общий ключ.
  3. Возможно, вы захотите создать механизм для вызова пользователей ReturnUrl с исходного сервера, чтобы вы могли отправить их обратно в нужное место.

Вы также могли бы взглянуть на "Forms Authentication Across Applications"

+0

Я знаю, что этот вопрос старый, но я борюсь с подобной ситуацией. Я создаю мобильный сайт, и мне нужно, чтобы он делился аутентификацией с основным сайтом (существующим сайтом). Я следил за предложениями в статье, которую вы связали в конце, но все равно не повезло. Я попробовал добавить атрибут 'domain =. Example.com' '(замененный доменом основного сайта), но теперь проверка подлинности вообще не работает. (Выход из системы не влияет, я даже очистил файлы cookie браузеров.) Я бы подумал о том, чтобы заплатить разумную консультационную плату, если вы могли бы потратить некоторое время на помощь. –

+0

Шаг 2 звучит немного подозрительно ... шифрует данные для входа и перенаправляет их на известную страницу во втором домене .... hmmm ... хакер может перехватить зашифрованные данные между вашим сервером и клиентом, а затем войти в учетная запись жертвы из 2-го домена с использованием этих зашифрованных данных. Они даже не должны были расшифровывать данные. Они просто используют ваш javascript-код на стороне клиента и вводят зашифрованные данные в вашу собственную систему, а затем компрометируют его. Даже если вы заработали зашифрованные данные за миллисекунды, хакер может быть быстрее, чем перенаправляется пользователем. –

+0

Привет, Марк - действительно, в идеале все это должно быть за SSL, что должно смягчить большинство этих проблем - действительно, зашифрованные данные должны жить дольше, чем миллисекунды, поскольку мы говорим о сетевом трафике и задержке. Не уверен, откуда взялось предположение JavaScript (я мог бы быть более конкретным), мы отправляли переадресацию «302» в качестве ответа, который заставил браузер выдавать соответствующий запрос следующему серверу в цепочке, однако, если я правильно напомню это все еще полагался на строки запросов - следовательно, использование SSL. Тогда мы были более ограничены компрометацией SSL. –

-4

Вы должны прочитать Explained: Forms Authentication на MSDN. Они охватывают междоменную аутентификацию.

+4

@Filip, где в этом документе это относится к междоменной аутентификации? Я просмотрел документ и не могу найти информацию рядом с точками, которые, как представляется, исключают междоменную аутентификацию. Существует ссылка на статью, в которой говорится об аутентификации в нескольких доменах AD, что, очевидно, является другим проблемным пространством. – Lazarus

3

Вы можете попробовать установить cookieless="true".

+0

Я не уверен, как это разрешило бы перекрестное доменное удостоверение? –

+1

Вместо файлов cookie (которые ограничены одним доменом) он отправляет билет аутентификации в URL-адрес. –

+0

@ Darin, но токен в URL-адресе по-прежнему однозначно кодируется для аутентифицирующего сервера, не так ли? – Lazarus

Смежные вопросы