Я использую HttpModule для перезаписи URL на многоязычном сайте. В модуле HttpModule я добавляю обработчик для события BeginRequest и ищу первую часть пути, содержащую имя культуры.
Например, /fr-ca/index.aspx будет переписан в /index.aspx, а культура потока и пользовательский интерфейс установлены на 3084. Это отлично работает.
Введите аутентификацию форм. Проверка подлинности с помощью форм по-прежнему работает с не отображенным URL-адресом, но если пользователь не авторизован, он будет перенаправлен на loginUrl, как установлено в разделе проверки подлинности web.config, и включит параметр? ReturnUrl = querystring для обработки перенаправления обратно на запрошенный страница, как только пользователь аутентифицирован.
Здесь есть две проблемы, если пользователь запрашивает страницу на языке, отличном от языка по умолчанию:
- loginUrl игнорирует путь перед его перезаписью
- Параметр ReturnUrl также игнорировал необработанный путь.
Это эквивалентно Request.Url.PathAndQuery вместо Request.RawUrl.
Я не могу перейти к конвейеру при событии AuthorizeRequest, потому что тогда мне придется защищаться от всех возможных значений культуры, потому что я использую один файл web.config с несколькими путями расположения. Это также не устраняет первую проблему.
Я прошел через FormsAuthenticationModule в отражателе, и я вижу, где я мог бы изменить его, чтобы решить # 1 и # 2, но он, конечно, запечатан.
Я также много осматривал, но не вижу работоспособных решений.
FormsAuthenticationModule проверяет заголовок 401, созданный в UrlAuthorizationModule. Если вы ищете реферера (который пуст) на странице loginUrl, это подтверждает это.
Есть мысли?
РЕДАКТИРОВАТЬ # 1
Я использую IIS 6, а IIS 7 не вариант.
РЕДАКТИРОВАТЬ # 2
Страница входа не собирала стандартную культуру / язык пользовательского интерфейса, поскольку при создании локального ресурса (представление «Дизайн»: «Инструменты»> «Создать локальный ресурс») среда IDE добавила в директиву страницы следующее:
culture = "auto" meta: resourcekey = "PageResource1" uiculture = "auto"
Будьте осторожны с этим в vs.net 2008! По крайней мере, это решает одну из проблем с культурой по умолчанию, на которую нет ссылок, но # 1 и # 2 все еще остаются нерешенными.
РЕДАКТИРОВАТЬ 3
Я надеялся, что смогу перейти в одно из событий конвейера, чтобы выполнить свое собственное перенаправление, но в методе Отражение System.Web.Security.UrlAuthorizationModule OnEnter я узнал, что после установки заголовка 401 метод вызывает приложение. CompleteRequest, который, как вы можете догадаться, приводит нас прямо к событию EndRequest. Это то, что модуль FA прыгает в do redirect, и я боюсь, что не могу прыгнуть вперед, чтобы сделать свой собственный редирект! Я удивлен, что больше людей не сталкивалось с этой проблемой, или, возможно, они еще не вмешались.
* * Пример тысяча сорок-девять:
У меня есть раздел участника в физической папке / members /, который защищен проверкой подлинности с помощью форм.
В web.config у меня есть:
<authentication mode="Forms">
<forms loginUrl="~/members/login.aspx" timeout="40" />
</authentication>
и ...
<location path="members">
<system.web>
<authorization>
<deny users="?" />
<allow roles="Members" />
<deny users="*" />
</authorization>
</system.web>
</location>
Когда неаутентифицированный пользователь запрашивает страницу индекса / members /, он перенаправляется на loginUrl из раздела аутентификации, описанного выше, с помощью FormsAuthenticationModule. Он также добавляет параметр? ReturnUrl к запрошенной странице.
Это прекрасно работает, если пользователь просматривает веб-сайт с использованием культуры по умолчанию, но мой HttpModule устанавливает культуру на основе наличия имени культуры в первой части пути.
Итак, /fr-ca/members/index.aspx переписывается в /members/index.aspx и устанавливает культурную / пользовательскую культуру для канадского французского. К сожалению, FormsAuthenticationModule отправляет пользователя на страницу loginUrl с переписанным URL, а не с оригиналом. Таким образом, настройка культуры потеряна, а URL перенаправления неверен.
Надеюсь, это поможет @ Грег