【问题标题】:Formsauthentication for folder does not work on production server文件夹的 Formsauthentication 在生产服务器上不起作用
【发布时间】:2013-10-24 21:17:24
【问题描述】:

我在我的 Win8/VS2012 机器上开发了一个 ASP.NET 2.0 Web 应用程序(但使用的是 .NET2.0 而不是 4.0)。我想保护对许多文件夹的直接访问,例如为特定角色存储在 Content/Documents 文件夹中的 PDF 文件,使用表单身份验证。它适用于我的开发机器上的以下 web.config 文件,如果我直接输入 PDF 的 URL,我会被重定向到登录页面。

但是,当将整个解决方案复制到生产服务器(Windows 服务器 2003R2 sp1,安装了 .NET 2 和 4)时,可以直接访问这些文件,并且似乎表单身份验证不起作用。

如何在服务器上对此进行调查? 我的配置有什么问题?

注意:角色是在登录时分配的,没有角色提供者(互联网和 stackoverflow 上的许多文章都证明了这一点),我想我这样做是正确的,因为它适用于我的开发机器。

注意2:我注意到一件奇怪的事情是在win2003R2服务器上的IIS管理工具中,配置窗口与我在web.config文件中的配置窗口不对应。当我在 IIS 管理器中右键单击 Web 应用程序属性,转到 ASP.NET 选项卡,转到编辑配置并转到不同位置的授权选项卡时,看起来它只声明允许 * 而配置文件显然有拒绝 *。是否有可能在该服务器上不支持这种类型的配置文件(但是它也不会产生任何错误)。

提前谢谢

维姆

<?xml version="1.0"?>
<!-- 
Note: As an alternative to hand editing this file you can use the 
web admin tool to configure settings for your application. Use
the Website->Asp.Net Configuration option in Visual Studio.
A full list of settings and comments can be found in 
machine.config.comments usually located in 
\Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
 <connectionStrings>
   <add name="..." connectionString="..."  
   providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
  <httpRuntime maxRequestLength="102400" executionTimeout="600"/>
  <authentication    mode="Forms">
    <forms name="MYWEBAPP.ASPXAUTH"
           loginUrl="member_login.aspx"
           protection="All"
           path="/"/>
  </authentication>
  <authorization>
    <allow users="*"/>
  </authorization>
  <customErrors mode="Off"></customErrors>
  <compilation debug="true"/>
</system.web>

<location path="Content/Documents"> 
  <system.web>
    <authorization> 
      <allow roles="MEMBER,ADMINISTRATOR"/> 
      <deny users="*"/> 
    </authorization>
  </system.web>
</location>
<location path="Content/Events">
  <system.web>
    <authorization>
      <allow roles="MEMBER,ADMINISTRATOR"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
<location path="Content/News">
  <system.web>
    <authorization>
      <allow roles="MEMBER,ADMINISTRATOR"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
<location path="Content/PriceChange">
  <system.web>
    <authorization>
      <allow roles="MEMBER,ADMINISTRATOR"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
<location path="Administrator">
  <system.web>
    <authorization>
      <allow roles="MEMBER,ADMINISTRATOR"/>
      <deny users="*"/>
    </authorization>
  </system.web>
</location>
<location path="Member"> 
  <system.web>
    <authorization> 
      <allow roles="MEMBER,ADMINISTRATOR"/> 
      <deny users="*"/> 
    </authorization>
  </system.web>
</location>
</configuration>

【问题讨论】:

  • 我不确定我是否记得准确:包含您的脚本/webconfg 的文件夹是否在 iis 中创建为应用程序?

标签: asp.net iis


【解决方案1】:

您的配置没有问题。相反,静态文件(jpgs、csses、pdfs)由iis处理涉及asp.net管道。这意味着当您请求 pdf 文件时,您的授权规则将被忽略。

要解决此问题,您可以拥有一个 aspx 页面,该页面获取一个参数来说明应该下载哪个文件,或者配置应用程序以通过 asp.net 管道运行一些(或所有)静态文件。让 所有 请求通过 asplnet 的最简单方法是设置

runAllManagedModulesForAllRequests="true" 

在 web.config 的模块部分中。

【讨论】:

  • runAllManagedModulesForAllRequests 似乎是个好主意,但是,我更新了配置如下,并添加了额外的元素,但是文件仍然可以访问:-( schemas.microsoft.com/.NetConfiguration/v2.0"> ...
  • 我也在生产机器上进行了相同的更新并在那里进行了测试,以确保它不依赖于系统,但也将语句添加到应用程序的 web.config 文件中并没有产生任何影响不同之处。更重要的是,我更新了 web.config 以拒绝 root 上的所有用户,在这种情况下,我仍然得到静态文件,而所有动态文件都被重定向到登录页面......我猜不是所有的请求都通过 ASP。 NET 管道,即使该语句是应用程序的 web.config 的一部分
  • 如何将本地 web.config 放在配置仅包含授权部分的 pdf 文件夹中?这比将所有内容都放在全局 web.config 中更好。
  • 对不起,但这对我来说似乎不是一个好的解决方案。我现在将使用一个 aspx 页面进行测试,该页面从外部无法直接访问的位置返回文件...感谢您的响应,但遗憾的是 runAllManagedModulesForAllRequests 不起作用.. 似乎是正确的解决方案
猜你喜欢
  • 2016-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2019-10-09
  • 2020-05-20
  • 2014-06-15
  • 1970-01-01
相关资源
最近更新 更多