ASP.NET 3.5 IIS7角色安全实现

时间:2009-09-22 16:26:44

标签: iis-7 web-config asp.net-3.5 sqlroleprovider

我正在使用库存MS Forms Authentication和SqlRolesProvider在IIS7(Server '08)上运行ASP.NET 3.5应用程序。 (我使用aspnet_regsql工具生成表格。)

我们有三个角色:SysAdmins,AppAdmins和Users。所有用户都在用户中,用户可以使用SysAdmins,AppAdmins或两者。

我似乎无法获得一个Admin目录来阻止访问不在SysAdmins和AppAdmins中的用户。它允许所有登录用户,或任何人。

以下是我当前配置的相关位:

<configuration>
  ...
  <system.web>
    <authentication mode="Forms">
      <forms loginUrl="/client/security/login.aspx" timeout="480" />
    </authentication>
    <authorization>
    </authorization>
    <roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="EquityTouch.Roles" cookieProtection="All" cookieSlidingExpiration="true" cookieTimeout="60">
      <providers>
        <clear />
        <add name="SqlRoleProvider" applicationName="EquityTouch" connectionStringName="SQLProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </providers>
    </roleManager>
    ...
  </system.web>
  <system.webServer>
    <security>
      <authorization>
        <add accessType="Deny" users="?" />
      </authorization>
    </security>
    ...
  </system.webServer>
  <location path="admin">
    <system.webServer>
      <security>
        <authorization>
          <remove users="*" roles="" verbs=""/>
          <add accessType="Allow" roles="SysAdmins,AppAdmins" />
        </authorization>
      </security>
    </system.webServer>
    <system.web>
      <authorization>
        <deny users="*"/>
        <allow roles="SysAdmins,AppAdmins"/>
      </authorization>
    </system.web>
  </location>
</configuration>

我相信此配置目前阻止所有人。我做了类似的配置,无法阻止任何人。

我怀疑问题在于使用system.web和system.webserver部分。任何帮助使这种配置正常工作将不胜感激。

更新

删除&lt; system.webServer&gt;来自&lt; location&gt;的部分element使得该文件夹中的.aspx页面正确返回!不幸的是,该文件夹中的.js文件仍然被所有用户阻止...理想情况下,我想锁定.js文件以及无特权的眼睛。所以我还在寻求帮助。

1 个答案:

答案 0 :(得分:6)

即使在IIS7集成管道模式下,我也成功使用了旧的IIS6样式的授权块。请尝试以下代码,其中包括以下更改:

  1. 添加&lt; deny users =“?” /&GT;到第一个授权块
  2. 切换&lt; allow&gt;的顺序和&lt; deny&gt;在特定位置的授权块中
  3. 已删除&lt; system.webServer&gt;特定于位置的授权块
  4. 要允许js文件通过,我最好的建议是将它们移动到一个单独的文件夹,并允许除匿名之外的所有文件夹访问该文件夹(见下文)。或者,您可以在位置的路径属性中命名每个js文件。但是,该解决方案难以维护。
  5. 请告诉我这是否适合您!

    <configuration>
      <system.web>
        <authentication mode="Forms">
          <forms loginUrl="/client/security/login.aspx" timeout="480" />
        </authentication>
        <authorization>
          <deny users="?"/>
        </authorization>
        <roleManager defaultProvider="SqlRoleProvider" enabled="true" cacheRolesInCookie="true" cookieName="EquityTouch.Roles" cookieProtection="All" cookieSlidingExpiration="true" cookieTimeout="60">
          <providers>
            <clear />
            <add name="SqlRoleProvider" applicationName="EquityTouch" connectionStringName="SQLProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </roleManager>
      </system.web>
    
      <location path="admin">
        <system.web>
          <authorization>
            <allow roles="SysAdmins,AppAdmins"/>
            <deny users="*"/>             
          </authorization>
        </system.web>
      </location>
      <location path="js">
        <system.web>
          <authorization>
            <deny users="?"/>
            <allow users="*"/>
          </authorization>
        </system.web>
      </location>
    </configuration>