如何使ImageResizer忽略ASP.NET Forms身份验证规则?

时间:2012-05-21 07:59:56

标签: forms-authentication webforms imageresizer

我们正在构建使用表单身份验证保护的Web应用程序。在某个页面上,我们有一个缩略图列表。这些缩略图是使用ImageResizer生成的,如下所示:

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

使用Visual Studio 2010的内置Web服务器在开发过程中一切正常。当我们将应用程序部署到我们的生产服务器(运行Windows 2008和IIS 7.5)时,我们注意到缩略图不再起作用了。当我们将开发构建切换到IIS Express而不是Cassini时,我们遇到了同样的问题。

  1. 直接导航到/Data/Pictures/image01.jpg时(登录后),我们可以看到图片。

  2. 直接导航到/Data/Pictures/image01.jpg?width=100时(登录后),我们收到以下错误消息:

      

    '/'应用程序中的服务器错误。

         

    不提供此类型的页面。

         

    说明:您已请求的页面类型未被提供,因为它已被明确禁止。扩展程序“.jpg”可能不正确。请查看下面的网址,确保拼写正确。

         

    请求的网址 /Data/Pictures/image01.jpg

  3. 直接导航到/Data/Pictures/image01.jpg.ashx?width=100时(登录后),我们可以看到已调整大小的图像。

  4. 该问题的解决方法是从Forms身份验证中排除图片目录,如下所示:

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

    现在缩略图再次可见,但我对这种解决方法感觉不太正确。

    我已经在the site of the 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>
    

2 个答案:

答案 0 :(得分:3)

ImageResizer旨在与IIS 5,IIS 5.1,IIS 6,IIS 7,IIS 7.5,Cassini和IIS Express的默认安装中的ASP.NET URL授权正确集成。

然而,IIS7上至少有十几种可用的排列。 IIS 7.5。您可以有选择地安装或卸载,(以及启用或禁用)IIS 6 Legacy,IIS 7,ASP.NET 2和ASP.NET 4 Url授权模块。还有集成模式或经典模式。在经典模式中,它都是基于扩展的,这意味着它们可以自定义或there could be a wildcard mapping。然后是RAMMFAR属性RunAllManagedModulesForAllRequests。此外,您可以在几个单独的UrlAuthorizationModules上设置前置条件,以控制它们执行的扩展。这些变量中的每一个都会影响4个URL授权引擎中的哪个控制哪些文件类型,这些变量中的一个或多个设置错误

现在,在干净的安装中,ImageResizer可以确保一切都得到妥善处理;根据ASP.NET身份验证和授权规则,所有映像都遵循ASP.NET规则。但是有很多方法搞乱了Url授权,并且不知道在IIS中安装和启用了哪些模块,并且看到了Web.config的完整副本,我不知道为什么ASP.NET UrlAuthorization没有得到一贯地应用。

ImageResizer最小化 - 除非图像具有查询字符串,并且该查询字符串具有已识别的命令,ImageResizer将不会对其执行任何操作。因此,只有处理过的图像才会被“强制”遵循ASP .NET URL授权规则。

默认情况下,未处理的请求(没有querystring命令)也应遵循ASP.NET规则,假设您在集成模式下运行。但是,您的安装或配置错误 。 “这种类型的页面不会被提供。”是IIS的已知403消息,但它通常也意味着未正确配置事物。静态文件不遵循ASP.NET规则这一事实是配置问题的另一个指标。

验证操作系统/ IIS配置问题的一种简单方法是启动labslice虚拟机(仅花费四分之一),然后将软件放在那里。如果你再次看到问题,你知道它在Web.config中。如果没有,它是IIS / Machine.config或OS级别。

您已经说过一个解决方案 - 为图片添加URL授权例外,因此ImageResizer不需要身份验证即可显示它们。

答案 1 :(得分:1)

我遇到了类似的问题: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";