2

フォーム認証を使用して保護されたWebアプリケーションを構築しています。特定のページに、サムネイルのリストがあります。これらのサムネイルは、次のようにImageResizerで生成されます。

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

これは、Visual Studio 2010の組み込みWebサーバーを使用した開発中にすべて正常に機能していました。アプリケーションを運用サーバー(Windows2008およびIIS7.5を実行)に展開すると、サムネイルが機能しなくなったことがわかりました。開発ビルドをCassiniではなくIISExpressに切り替えると、同じ問題が発生しました。

  1. 直接ナビゲートすると/Data/Pictures/image01.jpg(ログイン時)、画像が表示されます。

  2. /Data/Pictures/image01.jpg?width=100直接(ログインしたときに)ナビゲートすると、次のエラーメッセージが表示されます。

    '/'アプリケーションのサーバーエラー。

    このタイプのページは提供されません。

    説明:明示的に禁止されているため、リクエストしたタイプのページは提供されません。拡張子「.jpg」が正しくない可能性があります。以下のURLを確認し、スペルが正しいことを確認してください。

    要求されたURL: /Data/Pictures/image01.jpg

  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>が、この方法で解決できませんでした。

この問題を解決するために何ができるでしょうか。

アップデート

アプリケーションを2つの本番サーバーにデプロイしましたが、どちらも同じ問題を抱えています。IISExpressの2台の開発者マシンにも問題があります。私たちの本番サーバーは、構成が必ずしも同じではありません(これはわかりませんが、若干の違いがあると思います)。だから私は推測します(実際には、私は願っています:-))原因は以下の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>
4

2 に答える 2

4

ImageResizerは、IIS 5、IIS 5.1、IIS 6、IIS 7、IIS 7.5、Cassini、およびIISExpressの既定のインストールでASP.NETURL認証と適切に統合するように設計されています。

ただし、IIS7およびIIS7.5では少なくとも12の順列が利用可能です。IIS 6 Legacy、IIS 7、ASP.NET 2、およびASP.NET 4 URL認証モジュールを選択的にインストールまたはアンインストール(および有効化または無効化)できます。そして、統合モードまたはクラシックモードがあります。また、クラシックモードでは、すべて拡張機能ベースです。つまり、カスタマイズしたり、ワイルドカードマッピングを使用したりできます。次に、RAMMFAR属性RunAllManagedModulesForAllRequestsがあります。また、いくつかの個別のUrlAuthorizationModuleに前提条件を設定して、それらが実行する拡張機能を制御することもできます。これらの各変数は、4つのURL認証エンジンのどれがどのファイルタイプを制御するかに影響し、これらの変数の1つ以上が間違って設定されています。

これで、クリーンインストールで、ImageResizerはすべてが適切に処理されることを保証できます。すべてのイメージは、ASP.NET認証および承認ルールに従ってASP.NETルールに準拠します。しかし、URL承認を台無しにする方法は非常にたくさんあり、IISにインストールされて有効になっているモジュールを知らず、Web.configの完全なコピーを確認しないと、ASP.NETUrlAuthorizationが取得されない理由がわかりません。一貫して適用されます。

ImageResizerは最小限の動作をします。画像にクエリ文字列があり、そのクエリ文字列がコマンドを認識していない限り、ImageResizerは何もしません。したがって、処理されたイメージのみがASP.NETURL認証ルールに従うように「強制」されます。

統合モードで実行している場合、デフォルトでは、変更されていない要求(クエリ文字列コマンドなし)もASP.NETルールに従う必要があります。ただし、インストールまたは構成に問題があります。「このタイプのページは提供されません。」はIISの既知の403メッセージですが、通常は正しく構成されていないことも意味します。静的ファイルがASP.NETルールに準拠していないという事実は、構成の問題を示すもう1つの指標です。

OS / IIS構成の問題であることを確認する簡単な方法は、 labslice仮想マシンを起動して(4分の1の費用しかかかりません)、そこにソフトウェアを配置することです。問題が再び発生した場合は、Web.configに問題があることがわかります。そうでない場合は、IIS/Machine.configまたはOSレベルです。

すでに1つの解決策を述べました。画像のURL承認例外を追加して、ImageResizerが画像を表示するために認証を必要としないようにします。

于 2012-05-23T23:16:16.070 に答える
1

同様の問題がありました。ImageResizerはローカルでは正常に機能しましたが、サーバーでは機能しませんでした。これは、このプロジェクトで従来のパイプラインが使用されているためです。私の解決策:これを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";
于 2016-06-27T12:55:47.573 に答える