TL / DR. Я испытываю цикл перенаправления HTTP-302 при попытке поделиться файлом cookie аутентификации между сайтом ASP.NET WebForms и сайтом ASP.NET MVC, которые обслуживаются в отдельных поддоменах.
Подробности
a.website.com
- Существующий сайт WebForms.Работает нормально.
b.website.com
- Новый сайт MVC, который я пытаюсь интегрировать, используя общий файл cookie.
- Пользователь достигает b.website.com и еще не аутентифицирован.Они перенаправляются на a.website.com/Login.aspx.
- Пользователь вводит свое имя пользователя / пароль.
- Пользователь перенаправляется на исходную нужную страницу на b.website.com.
- b.website.com получает куки-запрос аутентификации в запросе, но по какой-то причине не видит пользователя аутентифицированным.Он отправляет их обратно на a.website.com/Login.aspx.
- 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-файл?