2010-05-25 5 views
29

공유 호스트에서 ASP.NET 4.0이 설치된 IIS 7.5 서버에서 실행되는 웹 사이트가 있지만 완전히 신뢰할 수 있습니다.IIS 7.5에서 ASP.NET 폼 인증을 사용하여 정적 파일을 보호하려면 어떻게합니까?

이 사이트는 방문자가 로그인하고 사용할 수있는 파일 목록을 표시 할 수있게 해주는 기본적인 "파일 브라우저"이며 분명히 파일을 다운로드합니다. 정적 파일 (주로 pdf 파일)은 data라는 사이트의 하위 폴더에 있습니다 (예 : http://example.com/data/ ...

이 사이트는 ASP.NET 폼 인증을 사용합니다.

내 질문은 : ASP.NET 엔진이 데이터 폴더의 정적 파일에 대한 요청을 처리하여 파일 요청이 ASP.NET에 의해 인증되고 사용자가 딥 링크 할 수 없도록하려면 어떻게해야합니까? 파일에 넣고 허락하지 않는 파일을 가져 가야합니까?

감사합니다. Egil.

답변

40

응용 프로그램 풀이 통합 모드에서 실행중인 경우 다음을 수행 할 수 있습니다.

최상위 web.config에 다음을 추가하십시오.

<system.webServer> 
    <modules> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    </modules> 
    </system.webServer> 

이제 web.config에서 표준 ASP.NET 권한을 사용하여 디렉토리의 모든 파일에 대한 폼 인증을 적용 할 수 있습니다.

<system.web> 
    <authorization> 
     <deny users="?" /> 
    </authorization> 
    <authentication mode="Forms" /> 
</system.web> 
+0

감사합니다. 그래도 의견. 어쨌든 사이트의 루트가 아닌 web.configs에서 "인증"섹션을 사용하도록 허용되지 않았습니다. 어쨌든 사용자와 함께 작동하는 것 같습니다. 그러나 가있을 때 인증을받지 못했지만 허용 목록에 명시 적으로 사용자를 추가하고 다른 모든 인증 된 사용자를 거부하면 작동합니다. webServer 모듈 섹션에 뭔가 빠져서 사용자와 함께이 역할을 할 수 있습니까? –

+0

어, 고마워요! 알아 내기가 너무 어렵지 않아야합니다. 나를 위해 일해. –

+0

이 기능은 작동하지만 로그인 페이지에서 사용되는 모든 css/gif 파일도 차단합니다. 그 사람들에게 보여줄 수있는 방법은 없나요? – eych

12

나는 역할을 인증받는 것과 동일한 문제가있었습니다. 시행 착오를 통해 나는 마침내 커닝햄의 코드 @Joel에 작은 편집 작업을 할 수있어 : http://forums.iis.net/t/1177964.aspxhttp://learn.iis.net/page.aspx/244/how-to-take-advantage-of-the-iis-integrated-pipeline/

+0

이 작품 !!!! ;) – NitroxDM

+5

이것은 쓰레기 일 뿐이며 그 이유를 알지 못합니다. 이렇게하면 모든 관리되는 모듈이 모든 요청을 포착하기 때문에 성능 문제가 커집니다. @ John의 솔루션이 필요합니다. – Adaptabi

+2

이봐, @DotNetWise에 동의한다. 필요한 경우 모든 요청에 ​​대해 모든 관리되는 모듈을 실행하는 대신 모든 요청에 ​​대해 실행될 모듈을 체리 선택해야합니다. 예 : - 전제 조건이 비어 있음을 확인합니다. – Anton

9

이 오래된 스레드이지만, I :

<modules runAllManagedModulesForAllRequests="true" > 

을 나는이 두 개의 참조 같은 사이트를 사용 그 일이 일어 났고 Egil과 같은 문제가 발생했습니다. 여기에 역할이 포함 조엘의 수정 버전은 다음과 같습니다

<modules runAllManagedModulesForAllRequests="false"> 
     <remove name="FormsAuthenticationModule" /> 
     <add name="FormsAuthenticationModule" type="System.Web.Security.FormsAuthenticationModule" /> 
     <remove name="UrlAuthorization" /> 
     <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
     <remove name="RoleManager" /> 
     <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
     <remove name="DefaultAuthentication" /> 
     <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
</modules> 
4

부록 : @eych으로

~/Content 폴더로이 또한 액세스를 차단 지적 (또는 당신이 당신의 CSS를 가지고 어디든지), 및 ~/Scripts 등 에.

예외 허용 - 인증되지 않은 사용자가 특정 파일/폴더에 액세스 할 수 있도록 허용하려는 경우 location 요소를 사용하여 예외를 수행 할 수 있습니다.

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

업데이트 : 다음 web.config에 추가이 더 나은 솔루션이다 것은 기본적으로 액세스에두고하는 것입니다 - 당신의 CSS에 대한 액세스를 허용 할/자바 스크립트/등 - 및

<location path="data"> 
    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 
</location> 

주의 할을 : 정적 컨텐츠가 저장되어있는 폴더에 (만) "잠금"적용 우리의 경우 (AN MVC 사이트)에 우리가와 (로그인 제외) 모든 컨트롤러 액션을 장식하는 데 필요한.어쨌든 좋은 생각이지만, 이전에 임의의 요청이 로그인 페이지로 리디렉션 되었기 때문에 이전에는 필요하지 않았습니다.

6

통합 파이프 라인에 기본적으로 추가되는 모듈 (기본 옵션 포함)을 다시 추가해야하는 이유를 알고 싶었 기 때문에 좀 더 자세히 살펴 보았습니다.

기본적으로 모듈은 기본 옵션으로 추가되지 않기 때문에 모듈을 제거하고 다시 추가해야합니다. 등록 된 ASP.NET 처리기 (예 : .aspx 페이지)가 처리하는 내용에 대해서만 이전 버전과의 호환성을 위해 전제 조건이 추가되었습니다.

기본값은 다음과 같습니다

<add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" 
     preCondition="managedHandler" /> 

모듈을 제거하고, 그 각각의 모듈 (정적 컨텐츠를 포함하여) 모든 요청에 ​​대해 실행의 전제 조건없이 그들을 다시 추가하여. runAllManagedModulesForAllRequests을 사용하는 것보다 세부적입니다.

당신은 통합 파이프 라인은 IIS 7에 도입 된 때부터 몇 기사에 대한 읽을 수

: 오타 나 모듈이 있음을

주 두 번째 기사의 이름 (@ John의 답변)이 FormsAuthenticationModule에서 FormsAuthentication으로 변경되었습니다.

나를 위해이 같은 8.5 외모를 통해 IIS 7.5에서 모듈을 작업 세트 :

당신이 응용 프로그램 풀을 클래식 모드에서 실행중인 경우
<system.webServer> 
    <modules> 
    <!-- Re-add auth modules (in their original order) to run for all static and dynamic requests --> 
    <remove name="FormsAuthentication" /> 
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" /> 
    <remove name="DefaultAuthentication" /> 
    <add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" /> 
    <remove name="RoleManager" /> 
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" /> 
    <remove name="UrlAuthorization" /> 
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" /> 
    </modules> 
</system.webServer> 
+0

분명히 알 수 있겠지만 특정 상황에 따라 이러한 모듈을 모두 필요로하지 않을 수도 있습니다 (예를 들어 RoleManager가 필요하지 않음). System.Web.SessionState와 같은 유사한 제한이있는 다른 모듈이 필요할 수 있습니다. SessionStateModule – Shaun

1

, 다음을 수행 할 수 있습니다. 처리 할 파일 확장자마다이 단계를 반복해야하지만 여기서 .html을 사용하고 있습니다.

첫째,의 Web.config에 페이지 빌드 공급자를 추가 :

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
    <handlers> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness32" path="*.html" verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" name="HtmlHandler-Classic-32" /> 
     <add scriptProcessor="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" requireAccess="Script" preCondition="classicMode,runtimeVersionv2.0,bitness64" path="*.html" verb="GET,HEAD,POST,DEBUG" name="HtmlHandler-Classic-64"/> 
    </handlers> 
    </system.webServer> 
</configuration> 
:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <httpHandlers> 
     <add type="System.Web.UI.PageHandlerFactory" path="*.html" verb="*"/> 
    </httpHandlers> 
    </system.web> 
</configuration> 

그런 다음 페이지 처리기를 추가 :

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.web> 
    <compilation> 
     <buildProviders> 
     <add type="System.Web.Compilation.PageBuildProvider" extension=".html"/> 
     </buildProviders> 
    </compilation> 
    </system.web> 
</configuration> 

그런 다음 페이지 핸들러 팩토리를 추가

이것은 나를 위해 일했습니다. (제공 금액 : http://www.ifinity.com.au/Blog/EntryId/66/How-To-301-Redirect-htm-or-html-pages-to-DotNetNuke-aspx-pages)

관련 문제