Как заставить ImageResizer игнорировать правила проверки подлинности с помощью форм ASP.NET?

Мы создаем веб-приложение, защищенное с помощью проверки подлинности с помощью форм. На определенной странице у нас есть список миниатюр. Эти эскизы создаются с помощью ImageResizer следующим образом:

<img src="/Data/Pictures/image01.jpg?width=100" />

Все это прекрасно работало во время разработки с использованием встроенного веб-сервера Visual Studio 2010. Когда мы развернули приложение на нашем производственном сервере (под управлением Windows 2008 и IIS 7.5), мы заметили, что миниатюры больше не работают. При переключении нашей сборки разработки на IIS Express вместо Cassini у нас возникла та же проблема.

  1. При непосредственном переходе к /Data/Pictures/image01.jpg (при входе в систему) мы можем видеть изображение.

  2. #P4#
    #P15# #P16# #P5# #P6#
  3. При непосредственном переходе к /Data/Pictures/image01.jpg.ashx?width=100 (при входе в систему) мы видим изображение с измененным размером.

Обходным решением проблемы было исключение каталога изображений из проверки подлинности с помощью форм следующим образом:

<location path="Data/Pictures">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>

Теперь эскизы снова видны, но я не совсем согласен с этим обходным путем.

Я отправил заявку в службу поддержки на сайте ImageResizer и спросил, почему изображения без строки запроса работают, а изображения со строкой запроса не работают. 'т. Автор ImageResizer ответил, и он сказал мне:

Поскольку ImageResizer не обрабатывает необработанные изображения, они обрабатываются IIS. Вам необходимо продублировать правила для защиты статического содержимого: http://www.iis.net/ConfigReference/system.webServer/security/authorization

Я прочитал эту страницу и попытался продублировать наши настройки аутентификации и авторизации в элементе <security> внутри <system.webServer>, но я не смог решить эту проблему таким образом.

Что мы можем сделать, чтобы решить эту проблему?

Обновлять

Я развернул приложение на двух наших рабочих серверах, и на обоих возникла одна и та же проблема. У нас также есть проблема на двух машинах разработчиков в IIS Express. Наши производственные серверы не обязательно идентичны по конфигурации (я не уверен в этом, но предполагаю, что должны быть некоторые незначительные различия). Итак, я предполагаю (на самом деле, я надеюсь :-)) причину можно найти в файле Web.Config ниже:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.3.1.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <section name="MyApp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
        </sectionGroup>
        <section name="resizer" type="ImageResizer.ResizerSection" />
        <section name="dotless" type="dotless.Core.configuration.DotlessConfigurationSectionHandler, dotless.Core" />
    </configSections>
    <connectionStrings>
        <add name="MyAppContext" connectionString="xxx" providerName="System.Data.SqlClient" />        
    </connectionStrings>
    <system.web>
        <pages validateRequest="false" />
        <httpRuntime requestValidationMode="2.0" />
        <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="nl-BE" uiCulture="nl-BE" />
        <authentication mode="Forms">
            <forms loginUrl="~/Default.aspx" timeout="480" />
        </authentication>
        <authorization>
            <deny users="?" />
        </authorization>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
            <parameters>
                <parameter value="Data Source=.\SQLEXPRESS; Integrated Security=True; MultipleActiveResultSets=True" />
            </parameters>
        </defaultConnectionFactory>
    </entityFramework>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Yahoo.Yui.Compressor" publicKeyToken="f8b4b81ec75097e2" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.7.1.0" newVersion="1.7.1.0" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="AjaxMin" publicKeyToken="21ef50ce11b5d80f" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-4.51.4507.18296" newVersion="4.51.4507.18296" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="dotless.Core" publicKeyToken="96b446c9e63eae34" culture="neutral" />
                <bindingRedirect oldVersion="0.0.0.0-1.3.0.3" newVersion="1.3.0.3" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules>
            <add name="ImageResizingModule" type="ImageResizer.InterceptModule" />
        </modules>
        <handlers>
            <add name="dotless" path="*.less" verb="GET" type="dotless.Core.LessCssHttpHandler,dotless.Core" resourceType="File" preCondition="" />
        </handlers>
    </system.webServer>
    <location path="Assets">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>
    <location path="Data/Pictures">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>
    <dotless minifyCss="false" cache="true" web="false" />
</configuration>

person Kristof Claes    schedule 21.05.2012    source источник


Ответы (2)


ImageResizer предназначен для правильной интеграции с авторизацией URL-адресов ASP.NET при установке по умолчанию IIS 5, IIS 5.1, IIS 6, IIS 7, IIS 7.5, Cassini и IIS Express.

Однако в IIS7 и IIS 7.5 доступно не менее дюжины перестановок. Вы можете выборочно установить или удалить (а также включить или отключить) модули авторизации URL-адресов IIS 6, IIS 7, ASP.NET 2 и ASP.NET 4. И есть интегрированный режим или классический режим. А в классическом режиме все основано на расширениях, то есть их можно настраивать или может быть сопоставление с подстановочными знаками. . Затем есть атрибут RAMMFAR, RunAllManagedModulesForAllRequests. Кроме того, вы можете установить предварительные условия для нескольких отдельных модулей UrlAuthorizationModules, чтобы контролировать, для каких расширений они выполняются. Каждая из этих переменных влияет на то, какие из четырех механизмов авторизации URL контролируют типы файлов, и одна или несколько из этих переменных настроены неправильно.

Теперь при чистой установке ImageResizer может убедиться, что все обрабатывается правильно; все изображения попадают под правило ASP.NET, следуя правилам аутентификации и авторизации ASP.NET. Но есть очень много способов испортить авторизацию URL-адресов, и, не зная, какие модули установлены и включены в IIS, и видя полную копию вашего Web.config, я не могу понять, почему ASP.NET UrlAuthorization не получает применяется последовательно.

ImageResizer действует минималистично: если у изображения нет строки запроса, и эта строка запроса не содержит распознанных команд, ImageResizer ничего не сделает с ним. Таким образом, только обработанные изображения «принуждаются» следовать URL-адресу ASP.NET. Правила авторизации.

По умолчанию нетронутые запросы (без команд строки запроса) также должны соответствовать правилам ASP.NET, если вы работаете в интегрированном режиме. Однако что-то не так с вашей установкой или конфигурацией. "Этот тип страницы не обслуживается." — это известное сообщение 403 для IIS, но оно также обычно означает, что что-то настроено неправильно. Тот факт, что статические файлы не соответствуют правилам ASP.NET, является еще одним признаком проблемы с конфигурацией.

Простой способ убедиться, что проблема связана с конфигурацией ОС/IIS, — запустить виртуальную машину labslice (стоит всего четверть доллара) , и поместите туда свое программное обеспечение. Если вы снова увидите проблему, знайте, что она в Web.config. Если нет, то это уровень IIS/Machine.config или ОС.

Вы уже указали одно решение — добавьте исключения авторизации URL-адресов для изображений, чтобы ImageResizer не требовал аутентификации для их отображения.

person Lilith River    schedule 23.05.2012
comment
Извините за задержку. Я обновил свой вопрос с помощью нашего кода Web.Config. - person Kristof Claes; 12.06.2012
comment
Спасибо. Почему вы считаете это обходным путем? Правила авторизации должны применяться ко всем типам файлов. Решение, которое мы нашли, вовсе не хакерское. Если посмотреть на проблему с правильной точки зрения, проблема, которую необходимо решить, заключается в том, почему IIS неправильно применяет правила аутентификации к статическим файлам. - person Lilith River; 12.06.2012
comment
Мне просто кажется странным, что без этого обходного пути, когда я вхожу в систему, /Data/Pictures/image.jpg работает, а /Data/Pictures/image.jpg?width=100 — нет. Результатом обходного пути является то, что изображения также доступны для тех, кто не вошел в систему (если они знают URL-адрес). - person Kristof Claes; 13.06.2012
comment
А, у меня сложилось впечатление, что вы хотели, чтобы все изображения были доступны анонимно. Я знаю, что у вас есть несколько серверов, сталкивающихся с проблемой, но поверьте мне, их конфигурация IIS довольно сильно испорчена. Мы не можем решить эту проблему без сеанса TeamViewer/RemoteDesktop. - person Lilith River; 13.06.2012
comment
Хорошо, спасибо за помощь. Тогда я просто оставлю обходной путь. Мы не можем предоставить кому-то за пределами нашей компании доступ к нашим производственным серверам, и я совершенно не знаю, с чего начать поиск в IIS. Я действительно должен найти время, чтобы узнать больше об IIS: -/ - person Kristof Claes; 13.06.2012
comment
Я хотел бы, чтобы были ссылки, на которые я мог бы указать вам, но такие вещи плохо документированы. Возможно, вам следует открыть новый вопрос, который будет более точным, например, почему мои правила проверки подлинности URL-адреса ASP.NET не применяются к статическим файлам? Однако это подбрасывание монеты, принадлежит ли оно SO или ServerFault :) - person Lilith River; 13.06.2012
comment
Но, насколько я могу судить (и я до сих пор этого не понимаю), правила аутентификации URL-адресов ASP.NET применяются к статическим файлам. Когда я удаляю обходной путь, я не могу получить доступ к /Data/Pictures/image.jpg, когда я не вошел в систему. Когда я вошел в систему, я могу получить к нему доступ. Так что работает нормально. Просто я никогда не могу получить доступ к /Data/Pictures/image.jpg?width=100; вошел ли я в систему или нет. На мой (сбитый с толку) взгляд URL-аутентификация применяется к статическим файлам, но не к статическим файлам, обрабатываемым Image Resizer. - person Kristof Claes; 14.06.2012

У меня была аналогичная проблема: Image Resizer отлично работал на локальном компьютере, но не на сервере. Это произошло потому, что в этом проекте используется классический пайплайн. Мое решение: добавьте это в Web.config

   <resizer>
    <pipeline fakeExtensions=".axd" defaultCommands="autorotate.default=true"/>
    <plugins>
      <add name="DiskCache" />
      <add name="PrettyGifs" />
      <add name="MvcRoutingShim" />
    </plugins>
  </resizer>
..
 <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules>
      <!-- This is for IIS7/8 Integrated mode -->
      <add name="ImageResizingModule" type="ImageResizer.InterceptModule"/>
    </modules>
  </system.webServer>

и добавьте это к ссылкам на изображения:

+ ".axd?height=165&width=297&mode=crop";
person Lőrincz Péter    schedule 27.06.2016