ASP.NET OAuth имеет проблемы с URL Rewrite

Моя производственная установка выглядит следующим образом:

  • M1 - Сайт ASP.NET
  • M2 - URL-адрес URL-адреса IIS 2.0 + ARR 3.0

Используя URL-адрес пересылки IIS, любой запрос на M2, скажем, http:// m2/app/login.aspx будет перенаправлен на M1, поскольку http:// m1/app/login.aspx.

В M1 на веб-сайте ASP.NET Open Auth реализована внешняя аутентификация Google. Когда пользователь нажимает кнопку Google, браузер будет перенаправлен на страницу входа в систему Google, чтобы пользователь мог аутентифицироваться.

Но когда веб-сайт доступен из M2, URL перенаправления, сгенерированный .net oAuth (https:// accounts.google.com/[строка запроса]) для перенаправления на Google, является заменяется URL-адресом Rewrite как http:// m2/[строка запроса].

Так просто быть ясным; когда запрос выполняется для аутентификации через поставщика внешней проверки подлинности, возвращается 302 перенаправление. Часто форма этого может выглядеть так:

Заголовки ответов:

...

Местоположение: https:// accounts.google.com/o/oauth2/auth? big_long_query_string

...

Этот перенаправление создается сервером (M1), который находится за прокси-сервером (M2-IIS URL Rewrite 2.0 + ARR 3.0). Поэтому перезаписывающий сервер перезаписывает заголовок Location:

Заголовки ответов:

...

Местоположение: http:// M1/o/oauth2/auth? big_long_query_string

...

Нам нужно правило, которое не переписывает URL-адрес местоположения при перенаправлении. Он может ориентироваться только на определенные переадресации. В большинстве случаев поведение, упомянутое здесь, требуется, поскольку все перенаправления перенаправляются на основной прокси-сервер. Может ли кто-нибудь предложить решение или обходное решение для определенных переадресаций?

Ответ 1

Отметьте Настройки маршрутизации запроса приложений в разделе IIS > [СЕРВЕР] > Маршрутизация запросов приложений и на боковой панели "Действия" Параметры прокси-сервера серверa > для обратного переписывания хост в заголовках ответов. Для желаемого поведения снимите флажок. Это настройка уровня сервера, используйте ответственно.

Вы также можете отредактировать %WinDir%\System32\Inetsrv\Config\applicationHost.config. В основном вставьте/обновите следующую строку в файле между тегами <system.webServer>.

<proxy enabled="true" reverseRewriteHostInResponseHeaders="false" />

Я бы предположил, что этот параметр доступен для каждого сайта, но мои попытки в файлах web.config для настроек прокси не подтвердили это.

Ответ 2

Откажитесь от global.asax. это HTTPModule. Все запросы проходят через этот файл и другие модули до того, как они дойдут до ваших обработчиков страниц. Используйте это для выполнения определенных задач в вашем запросе или ответе, например, маршрутизация URL, глобальная обработка ошибок и т.д. Этот файл используется для реализации событий приложения и уровня сеанса, таких как:

Application_Init - запускается, когда приложение сначала инициализирует

Application_Start - запускается при первом запуске приложения

Application_End - окончательное событие, запущенное при завершении или истечении срока действия приложения

Session_Start - запускается при первом запуске сеанса пользователя

Application_BeginRequest - запускается с каждым новым запросом

Application_EndRequest - запускается при завершении приложения

Application_AuthenticateRequest - событие указывает, что запрос готов к аутентификации.

Application_Error - срабатывает, когда необработанная ошибка возникает в приложении

Session_End - срабатывает всякий раз, когда один сеанс пользователя заканчивается или истекает время.

Ответ 3

Мне удалось решить ту же проблему с исходящим правилом в IIS. Поэтому вам необходимо создать исходящее правило в IIS в модуле перезаписи URL, чтобы изменить заголовок местоположения. Вы должны проверить заголовок состояния 302 как условие и указать URL-адрес URL-адреса и URL-адрес действия для заголовка местоположения. Ниже приведены шаги из указанной статьи.

Изменение заголовка местоположения с помощью перезаписи URL-адреса IIS

  • Перейдите в функцию URL Rewrite для вашего сайта и нажмите Добавить правило (ы)...
  • Выберите из раскрывающегося списка "Условие".
  • Нажмите "Добавить" в появившемся диалоговом окне
  • Введите {RESPONSE_STATUS} в поле ввода условия и 3 [0-9] [0-9] в поле шаблона.
  • Нажмите "ОК".
  • Выберите "Переменная сервера" из раскрывающегося списка "Сопоставление".
  • Введите RESPONSE_Location в качестве имени переменной.
  • В поле "Шаблон" введите регулярное выражение для соответствия URL-адресам, которые создает ваша бэкэнд-система (например, http://local/page)
  • В поле "Действие" введите правильный URL-адрес (например http://example.com/page)
  • Нажмите "Применить" и сделанное!

Ссылка: Обработка 301 и 302 перенаправлений с переходом URL-адреса IIS 7