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