Asp.NET 中,运用 其自身提供的访问验证功能(表单验证、Passport 验证、Windows 验证),并不会对静态文件(如 html、图像文件、文本文件等)执行 访问限定 ,即使这些文件置于须要 验证后才能访问的文件夹下,匿名用户仍然可以访问到这些文件。这是因为静态文件默认是由 IIS 处理,IIS 在接收到对这些文件的请求后,并不会转交给 ASP.NET 处理,所以,在 ASP.NET 中的权限验证失去了作用。换句话说,这些文件不在 ASP.NET 的管辖范围内。
那么,如何 将这些文件置于 ASP.NET 的管辖范围内呢?
以 html 文件为例,最基本 的办法是将 html 文件的后缀改为 aspx,这个办法很基本 ,也算实用,但并不正规。
另一种要领 是针对 IIS 执行 配置 ,让 IIS 将 html 文件的处理权转交给 ASP.NET。配置 如下:
(1) 打开 IIS,找到须要 配置 的 ASP.NET 运用 程序,打开属性对话框。
(2) 在“虚拟目录”选项卡中有一个“运用 程序配置”,点击这里面的“配置”按钮,弹出新的对话框。
(3) 在“对应”选项卡中,点击“新增”按钮,添加 .htm 的后缀与处理程序的对应联系 ,具体配置 可参照 .aspx 的配置 。
配置 好之后,再次访问位于须要 验证的目录下的 html 文件,会转到登录页面提示用户登录,说明访问验证已经生效。但到此仍未完成,因为登录后会发觉 ,htm 文件不正确 。这涉及到 HttpHandler 的疑问 ,因为对于 ASP.NET 来说,这相当于启用了一种新的文件类型,但却没有相应的处理程序。所以,还须要 改动 web.config 的配置 ,注册一个新的处理程序,对于 html 文件,我们可以运用 aspx 文件的处理程序,所以配置 如下:
<system.web> ...
<httpHandlers> ...
<!-- 添加 后缀为 htm 文件的处理程序,这里运用 aspx 文件的处理程序 -->
<add verb="*" path="*.htm" type="System.Web.UI.PageHandlerFactory"/> </httpHandlers> ...
</system.web>
再次访问,这次是编译不正确 ,因为缺少对 htm 文件的相应编译程序,再修改 web.config:
<system.web>
<compilation> ...
<!-- 配置 后缀为 htm 的文件的编译程序,这里运用 aspx 文件的编译程序 -->
<buildProviders>
<add extension=".htm" type="System.Web.Compilation.PageBuildProvider"/> </buildProviders>
</compilation> ...
</system.web>
这回再访问这个 html 文件,它正如我们期望的一样,须要 执行 身份验证,并且也可以 够正常显示。
其实这个疑问 的核心在于对 HttpHandler 的理解。
另外,据说在 IIS 7 中,只要把运用 程序放在模式为 Integrated 的运用 程序池中,就可以处理 这个疑问 。