ImageResizer가 ASP.NET 양식 인증 규칙을 무시하도록 하려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com//questions/10681460

문제

우리는 양식 인증을 사용하여 보호되는 웹 애플리케이션을 구축하고 있습니다.특정 페이지에는 썸네일 목록이 있습니다.이러한 썸네일은 다음과 같이 ImageResizer를 사용하여 생성됩니다.

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

Visual Studio 2010의 내장 웹 서버를 사용하여 개발하는 동안 이 모든 것이 잘 작동했습니다.프로덕션 서버(Windows 2008 및 IIS 7.5 실행)에 응용 프로그램을 배포했을 때 축소판이 더 이상 작동하지 않는 것을 발견했습니다.개발 빌드를 Cassini 대신 IIS Express로 전환할 때도 동일한 문제가 발생했습니다.

  1. 탐색할 때 /Data/Pictures/image01.jpg 직접(로그인 시) 이미지를 볼 수 있습니다.

  2. 탐색할 때 /Data/Pictures/image01.jpg?width=100 직접(로그인 시) 다음 오류 메시지가 표시됩니다.

    '/' 응용 프로그램에 서버 오류가 있습니다.

    이 유형의 페이지는 제공되지 않습니다.

    설명: 요청하신 페이지 유형은 명시적으로 금지되었기 때문에 제공되지 않습니다.확장자 '.jpg'가 올바르지 않을 수 있습니다.아래 URL을 검토하여 철자가 올바른지 확인하세요.

    요청된 URL: /데이터/그림/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> 하지만 이 방법으로는 해결할 수 없었습니다.

이 문제를 해결하기 위해 우리는 무엇을 할 수 있나요?

업데이트

두 개의 프로덕션 서버에 애플리케이션을 배포했는데 둘 다 동일한 문제가 있습니다.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>
도움이 되었습니까?

해결책

ImageResizer는 IIS 5, IIS 5.1, IIS 6, IIS 7, IIS 7.5, Cassini 및 IIS Express의 기본 설치에서 ASP.NET URL 권한 부여와 제대로 통합되도록 설계되었습니다.

그러나 IIS7 & IIS 7.5에서는 적어도 12 가지 순열을 사용할 수 있습니다. IIS 6 레거시, IIS 7, ASP.NET 2 및 ASP.NET 4 URL 인증 모듈을 선택적으로 설치하거나 제거하거나 제거 할 수 있습니다. 그리고 통합 모드 또는 클래식 모드가 있습니다. 그리고 클래식 모드에서는 모든 확장 기반이며, 사용자 정의 할 수 있거나 와일드 카드 매핑이있을 수 있습니다 ...에 그런 다음 rammfar 속성, RunAllManagedModulesForallRequests 또한 여러 개별 UrlauthorizationModules에서 전제 조건을 설정하여 실행중인 확장자를 제어 할 수 있습니다. 이러한 각 변수는 4 개의 URL 권한 엔진 중 어느 것이 어떤 파일 형식을 제어하는지, 이 변수 중 하나 이상이 잘못된 를 설정하는지에 영향을 미칩니다.

이제는 깨끗한 설치시 ImageResizer는 모든 것이 올바르게 처리되는지 확인할 수 있습니다. 모든 이미지는 ASP.NET 인증 및 권한 부여 규칙에 따라 ASP.NET 규칙에서 이동합니다. 그러나 URL 권한 부여가 엉망이되는 많은 방법이 있으며 IIS에서 설치 및 활성화 된 모듈을 모르고 Web.config의 전체 사본을 알지 못하면 ASP.NET Urlauthorization이 이유가없는 이유를 알 수 없습니다. 일관되게 적용됩니다.

imageSizer는 미니멀리즘으로 작동합니다 - 이미지가 queryString을 가지며 queryString이 인식 된 명령이 아닌 경우 ImageResizer는 아무 것도하지 않습니다. 따라서 처리 된 이미지 만 ASP를 따르기 위해 '강제'만 '강제'됩니다. .NET URL 권한 부여 규칙.

기본적으로 QueryString 명령을 사용하지 않는 요청 (QueryString 명령이없는)은 ASP.NET 규칙을 다음과 같아야합니다. 그러나 뭔가 은 설치 또는 구성에 문제가 있습니다. "이 유형의 페이지는 제공되지 않습니다." IIS에 대한 알려진 403 메시지이지만 일반적으로 사물이 올바르게 구성되지 않았 음을 의미합니다. 정적 파일이 ASP.NET 규칙을 따르지 않는다는 사실은 구성 문제의 또 다른 지표입니다.

OS / IIS 구성 문제가 래브 슬라이스 가상 시스템을 시작하는 것이 좋습니다 (비용 1/4), 소프트웨어를 거기에 넣으십시오. 문제가 다시 발생하면 Web.config에 있습니다. 그렇지 않은 경우 IIS / Machine.config 또는 OS 레벨입니다.

이미 하나의 해결책을 명시했습니다 - 이미지에 대한 URL 권한 제외 추가 그래서 ImageResizer는 인증을 필요로하지 않아도됩니다.

다른 팁

비슷한 문제가있었습니다. 이미지 리셋 장치는 로컬에서는 잘 작동하지만 서버가 아닌가 아닙니다.클래식 파이프 라인 이이 프로젝트에서 사용되기 때문입니다.내 솔루션 : 이 웹을 추가하십시오 를 추가하십시오

   <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";
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top