我尝试通过global.asax
路由我的PDF文件以检查访问权限。
我为此添加了我的web.config:
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
并且
<system.web>
<httpHandlers>
<add verb="GET" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
</httpHandlers>
</system.web>
除非我的文件位于IIS虚拟目录中,否则这样可以正常工作。
请求的信息:
您使用的是哪个版本的IIS? 微软-IIS / 7.5
您使用的是集成模式还是经典模式? 它以集成模式运行。
请求是否完全转移到您的处理程序? 我真的没有处理程序,我只是不想使用Integreated处理程序。
是否运行Application_BeginRequest?
不,它甚至没有点击Application_BeginRequest
您是否在IIS中安装了任何非标准ISAPI模块? 不,我想不是。
我将web.config编辑为:
<system.webServer>
<handlers>
<add name="ScriptResource.axd_GET,HEAD" path="ScriptResource.axd" verb="GET,HEAD" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="*_AppService.axd_*" path="*_AppService.axd" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="*.asmx_*" path="*.asmx" verb="*" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" preCondition="integratedMode,runtimeVersionv2.0" />
<add name="PdfHandler" verb="*" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
</handlers>
<validation validateIntegratedModeConfiguration="false"/>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
我删除了httpHandlers
,我发现了一个错误:
Could not load file or assembly 'Pipeline' or one of its dependencies. The system cannot find the file specified.
所以我认为问题是`type="Pipeline.TimeHandler, Pipeline"
不起作用。但是我应该如何配置使用标准IIS pipline来执行Application_AuthenticateRequest
。
答案 0 :(得分:2)
您正在混合集成模式和经典模式配置。在经典模式(system.web)中注册HTTP处理程序时,似乎您的IIS配置为集成模式(在system.webServer中有设置)。
尝试将此添加到您的system.webServer配置部分:
<handlers>
<add name="SampleHandler" verb="*" path="*.pdf" type="Pipeline.TimeHandler, Pipeline" />
</handlers>
如果这不是您的问题,请提供更多信息:
您可以获得任何其他有用的信息。
请注意,在经典模式下,您还必须设置ASP.NET ISAPI模块以处理所有请求(默认情况下,它只处理对* .aspx,* .asmx等的请求),或者至少添加*。 PDF。
编辑:哦,所以你实际上没有自己的PDF处理程序?在这种情况下,您只需要确保为静态文件运行身份验证(runAllManagedModulesForAllRequests应该足够),并且您必须确保用户实际需要一些权限来读取您的文件。您必须通过配置拒绝访问目录中的文件。例如,您可以将其添加到您的文件所在目录中的web.config中:<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
这基本上说:拒绝访问所有匿名(即未登录)用户。
答案 1 :(得分:0)
技术上Luaan回答是对的。
在我的具体情况中,事实证明虚拟目录是一个虚拟应用程序,它有自己的管道和一切。所以我只是删除它,并将其添加为虚拟目录,这可以按预期工作。