ASP.NET 2.0 и 4.0, похоже, по-разному обрабатывают корневой URL-адрес в проверке подлинности с помощью форм - PullRequest
5 голосов
/ 22 февраля 2011

Если есть следующее web.config:

<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="MembershipCookie" 
             loginUrl="Login.aspx" 
             protection="All" 
             timeout="525600" 
             slidingExpiration="true" 
             enableCrossAppRedirects="true" 
             path="/" />
    </authentication>
    <authorization>
      <deny users="?"  />
    </authorization>
  </system.web>
  <location path="Default.aspx">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
</configuration>

Приложение представляет собой приложение ASP.NET 2.0, работающее в Windows 2008R2 / IIS7.5.

Если пул приложений сайта настроен для работы ASP.NET 2.0, и я выбираю http://example.com, тогда Default.aspx отображается так, как вы ожидаете из приведенных выше правил.

Однако, если пул приложений настроен на запуск ASP.NET 4.0, я перенаправлен на страницу входа. Если я явно укажу http://example.com/default.aspx, тогда все хорошо, а default.aspx рендерит.

Я попытался переписать / -> /default.aspx (с помощью IIS UrlRewriter 2.0), но результат все тот же, меня выгоняют на страницу входа.

Я также пробовал это с приложением ASP.NET 4.0 с тем же результатом (именно там изначально возникла проблема). Причина, по которой я попытался сделать это с приложением 2.0, заключалась в том, чтобы увидеть, не было ли изменений в поведении, и кажется, что / обрабатывается по-другому в 4.0.

Итак, для подведения итогов, используя приведенную выше конфигурацию, наблюдается следующее:

ASP.NET Version  Url                                 Behaviour
-------------------------------------------------------------------------
2.0              http://example.com                  Renders Default.aspx
2.0              http://example.com/Default.aspx     Renders Default.aspx
4.0              http://example.com                  Redirects to Login.aspx
4.0              http://example.com/Default.aspx     Renders Default.aspx

Это ошибка / критическое изменение или я пропустил что-то явно очевидное?

Обновление:

Я дошел до сути этой проблемы, см. Мой собственный ответ ниже.

1 Ответ

4 голосов
/ 23 февраля 2011

Нашли виновника.В рамках наших изменений на стороне сервера WebDeploy 2.0 / WebMatrix это исправление рекомендуется WebMatrix Server Validator :

MS KB: 980368 - Доступно обновление, позволяющеенекоторые обработчики IIS 7.0 или IIS 7.5 для обработки запросов, URL-адреса которых не заканчиваются периодом

При установке этого оперативного исправления ASP.NET 4.0 меняет поведение проверки подлинности с помощью форм, где только имя доменазапрашивается часть URL.

Обновление 1:

Этот QFE также является частью Windows 2008R2 SP1 и также нарушит проверку подлинности с помощью форм в ASP.NET 4.0 вкак описано выше.

Обновление 2:

Кроме того, это также нарушает обработку документов по умолчанию при запуске классических приложений ASP в пуле приложений, настроенном для работы в качестве ASP.NET.& Classic Pipeline mode.

Сервер возвращает ошибку 404.2 - Not Found.

Такое же критическое изменение относится к Windows 2008R2 SP1.

Обновление 3:

Я сообщил об этом MS PSS, и они подтвердили резкое изменение в поведении.Они создали эту статью базы знаний в ответ на нас (и, вероятно, на других), которые были затронуты ею:

Веб-службы могут не работать в Microsoft Internet Information Services (IIS) 7.5 и Windows 7 Service Pack1 с .NET Framework 4.0 из-за обработчиков URL без расширений

В моем собственном случае я в основном удаляю (или советую клиентам) обработчики без расширений, если на них влияет эта проблема:

<configuration>
  <system.webServer>
    <handlers>
      <remove name="ExtensionlessUrl-Integrated-4.0" />
      <remove name="ExtensionlessUrl-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrl-ISAPI-4.0_32bit" />
    </handlers>
  </system.webServer>
</configuration>
...