2013-02-10 8 views
1

Существует чистый конфигурации *:Windows Identity Foundation и Port Forwarding

Client - FW - IIS

IIS прослушивает порт 8080, есть веб-приложение на IIS, например MyApp. FW реализует простую переадресацию портов (он заменяет порт 80 на порт 8080). Пусть следующий случай:

Клиент просит http://MyWebSite/MyApp/Index.aspx, FW изменяет Standart порт 80 на 8080 и запрос http://MyWebSite:8080/MyApp/Index.aspx. IIS возвращается на страницу, запрошенную клиентом. Index.aspx Одна импортная вещь: если пользовательские типы в браузере http://MyWebSite/myapp/index.aspx IIS возвращает http://MyWebSite/MyApp/Index.aspx (поэтому он меняет адрес URL по имени реального приложения). Все работает хорошо.

Но проблема возникает, если я вставляю в стандартный трубопровод WIF. Например, я хочу, чтобы MyApp принимал только аутентифицированных пользователей. Я хочу перенаправить пользователей к определенному поставщику удостоверений. Если пользователь пытается получить страницу http://MyWebSite/MyApp/Index.a spx, все работает нормально, пользователь перенаправляется на IP. Но если пользователь пытается получить http://MyWevSite/myapp/index.aspx (имя приложения в нижнем регистре), IIS возвращает клиенту перенаправление на http://MyWebSite:8080/MyApp/Index.aspx. Поскольку порт 8080 закрыт на FW, пользователь получает сообщение об ошибке. Если я удалю WIF из моего приложения, все снова отлично работает.

Неужели кто-нибудь столкнулся с проблемой?

ответ

1

Проблема была обнаружена Reflector, она находится в CookieHandler WIF.

Браузеры отправляют файлы cookie только в том случае, если запрашиваемый путь соответствует (с учетом случая) путь был установлен CookieHandler (по умолчанию виртуальный каталог приложения в IIS). Когда WIF обрабатывает запрос, он сравнивает запрошенный путь к пути CokkieHandler. Если они не совпадают (с учетом ситуации) WIF считает, что пользователь просто набрал неверный URL-адрес, но он или она все еще хочет получить доступ к приложению, но браузер пользователя не отправит сеансовый файл cookie, потому что случаи не совпадают, поэтому CookieHandler от WIF перенаправляет URL-адрес, но он ничего не знает о действительном номере порта, поэтому он просто добавил номер требуемого порта для перенаправления ответа. Браузер пытается перенаправить, запрошенный порт закрыт на FW, мы получим сообщение об ошибке.

В .NET FW 4.5 вы можете переопределить поведение CookieHandler по умолчанию с помощью собственного пользовательского CookieHandler и реализовать его метод MatchCookiePath (например, вы можете добавить специальный номер порта из файла конфигурации приложения).

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