Цикл перенаправления при попытке поделиться cookie между MVC и сайтом веб-форм - PullRequest
0 голосов
/ 03 октября 2018

TL / DR. Я испытываю цикл перенаправления HTTP-302 при попытке поделиться файлом cookie аутентификации между сайтом ASP.NET WebForms и сайтом ASP.NET MVC, которые обслуживаются в отдельных поддоменах.

Подробности

a.website.com - Существующий сайт WebForms.Работает нормально.

b.website.com - Новый сайт MVC, который я пытаюсь интегрировать, используя общий файл cookie.

  1. Пользователь достигает b.website.com и еще не аутентифицирован.Они перенаправляются на a.website.com/Login.aspx.
  2. Пользователь вводит свое имя пользователя / пароль.
  3. Пользователь перенаправляется на исходную нужную страницу на b.website.com.
  4. b.website.com получает куки-запрос аутентификации в запросе, но по какой-то причине не видит пользователя аутентифицированным.Он отправляет их обратно на a.website.com/Login.aspx.
  5. a.website.com видит файл cookie и обнаруживает, что пользователь прошел проверку подлинности, и перенаправляет пользователя обратно на b.website.com.

Шаги 4 и 5 повторяются до тех пор, пока браузер не прервет цикл.

Настройка

Настройка соответствует документации MSDN для Точная настройка проверки подлинности с помощью форм в приложениях : два сайта совместно используют настройки ключа компьютера и параметры проверки подлинности с помощью форм.Оба сайта находятся на одном сервере и экземпляре IIS.Оба сайта форсируют SSL.В файле web.config параметры Membership и RoleManager идентичны.

Для a.website.com, на котором размещена страница входа:

<httpCookies httpOnlyCookies="true" requireSSL="true" />    
<authentication mode="Forms">
<forms name="COOKIE_NAME"
         domain=".website.com"
         loginUrl="login.aspx" 
         defaultUrl="login.aspx"
         requireSSL="true"
         cookieless="UseCookies"
         protection="All"
         enableCrossAppRedirects="true"
         path="/"/>
</authentication>
<machineKey
  validationKey="((validation key))"
  decryptionKey="((decryption key))"
  validation="SHA1"
  decryption="AES" />

b.website.com имеетКонечно, очень похоже, за исключением того, что URL-адрес входа для неавторизованных пользователей направляет их на вход в систему на сайте «а».

<httpCookies httpOnlyCookies="true" requireSSL="true" />
<authentication mode="Forms">
<forms name="COOKIE_NAME" 
   domain=".website.com" 
   loginUrl="https://a.website.com/login.aspx" 
   defaultUrl="login.aspx" 
   requireSSL="true" 
   cookieless="UseCookies" 
   protection="All" 
   enableCrossAppRedirects="true" 
   path="/"/> 
</authentication> 
<machineKey validationKey="((validation key))" 
        decryptionKey="((decryption key))" 
        validation="SHA1" 
        decryption="AES" />

Устранение неполадок

Эта настройка работает, как и ожидалосьмоя машина для разработки и наш тестовый сервер (хотя без настроек domain и loginUrl, соответственно), где оба веб-сайта работают с одного домена, только с разными номерами портов.Например, при локальной разработке сайт «a» может запускаться с https://development:44301/, а сайт «b» - с https://development:44302/.Однако на производственном компьютере, где они фактически находятся на разных поддоменах , я испытываю цикл перенаправления.

Используя инструменты веб-разработчика браузера, я вижу, что файл cookie авторизацииотправляется на b.website.com после перенаправления входа в систему.Также на b.website.com, если я удалю атрибут [Authorize], украшающий контроллер, страницы будут загружены, как и ожидалось.Я вполне уверен, что проблема ограничена тем, как сайт MVC обрабатывает cookie-файл аутентификации в сценарии с ограниченным поддоменом.

Похоже, что такая же проблема была зарегистрирована в SO здесь и здесь , но эти пользователи не установили enableCrossAppRedirects="true".Эта настройка (которая включена в моем коде), кажется, необходима для перенаправления поддоменов, как я уже пробовал. Эта статья SO немного подробнее описывает настройку и указывает, что перенаправление должно выполняться через SSL, что я и делаю.

Чего мне не хватает?Как лучше отладить ошибку аутентификации, которая, по-видимому, возникает, когда сайт "b" получает, но не подтверждает cookie-файл?

1 Ответ

0 голосов
/ 04 октября 2018

Я наконец нашел ответ, не упомянутый в документации MSDN, на которую я ссылался выше.Большое спасибо за 2-летнюю запись в блоге Стива Смита .

Более старый сайт WebForms предназначался для предыдущей версии .NET, поэтому есть дополнительная режим совместимости строканастройка в конфигурации machineKey, чтобы справиться с этим.Если бы оба приложения были одной и той же версии, в этом не было бы необходимости.

Чтобы быть абсолютно понятным для будущих пользователей - в файле web.config старого сайта a.website.com WebForms, нацеленного на более раннюю версию .NETЯ использовал обычную настройку машинного ключа:

<machineKey
 validationKey="((validation key))"
 decryptionKey="((decryption key))"
 validation="SHA1"
 decryption="AES" />

В web.config более нового сайта MVC мне также пришлось указать режим совместимости для работы со структурой старого сайта:

<machineKey
 compatibilityMode="Framework20SP2"
 validationKey="((validation key))"
 decryptionKey="((decryption key))"
 validation="SHA1"
 decryption="AES" />

Обратите внимание, что строка режима совместимости НЕ обязательно является целевой платформой другого приложения.Для любой целевой версии между 2.0SP2 и 4.5 потребуется настройка «Framework20SP2».Проверьте ссылку выше, чтобы убедиться, что вы выбираете правильную!

С этим на месте (вместе с соответствующими настройками forms в оригинальной статье MSDN ) все работало отлично,

Я предвижу, что потрачу еще один день, чтобы выяснить, почему моя аутентификация нарушена, когда мы приступаем к обновлению целевой платформы старого сайта!

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