代码之家  ›  专栏  ›  技术社区  ›  cornwalker

如何使用FormsAuthentication授予对URL的匿名访问权限?

  •  21
  • cornwalker  · 技术社区  · 5 年前

    在大多数情况下,我的webapp需要身份验证才能做任何事情。有几个页面,即主页,我希望人们能够访问而不需要认证。

    具体来说,我希望允许匿名访问这些URL:

    /home 
    /default.aspx
    

    我正在使用ASP.NET MVC和FormsAuthentication。两个URL都指向同一视图:

    /home/index.aspx
    

    这是我在web.config中的当前配置。

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />      
    </authentication>
    <authorization>           
      <deny users="?" />      
    </authorization>
    

    阅读授权标签的文档时,它说“配置Web应用程序的授权,控制客户端对URL资源的访问。”看起来我应该能够使用授权标签指定URL并允许访问。

    类似:

    <authentication mode="Forms">
      <forms loginUrl="~/Account/LogOn" timeout="2880" />      
    </authentication>
    
    <authorization>           
      <deny users="?" />      
    </authorization>
    
    <authorization url="/default.aspx">           
      <allow users="?" />      
    </authorization>
    
    <authorization url="/home">           
      <allow users="?" />      
    </authorization>
    
    1 回复  |  直到 11 年前
        1
  •  41
  •   Brian Bolton    15 年前

    我不想回答我自己的问题,但既然我最终弄明白了,我想我会分享知识。

    使用location标签并按正确的顺序放置allow和deny标签。

    位置标记可用于配置特定的URL资源。在我的例子中,我想专门配置一些URL和文件夹。

    起初这不起作用,因为我的允许/拒绝顺序不正确。根据msdn,“授权模块根据找到的第一个访问规则是允许还是拒绝规则,授予或拒绝对URL资源的访问。”

    在我的例子中,我需要先把我所有的公共资料(default.aspx,home,styles,images,scripts)放在第一位,然后在其他所有东西上加一个deny。我在最后一个位置标签上遗漏了路径。这使得它适用于所有文件和子文件夹。

    最终的结果是,用户可以访问主页,调出图片和样式,但对于其他所有内容,都必须登录。

    以下是我的web配置文件:

    <!--AUTHORIZATION AND AUTHENTICATION RULES-->
      <location path="default.aspx">
        <system.web>
    
          <authorization>
            <allow users="?"/>
          </authorization>
        </system.web>
    
      </location>
    
      <location path="Home">
        <system.web>
    
          <authorization>
            <allow users="?"/>
          </authorization>
        </system.web>
    
      </location>
    
      <location path="Styles">
        <system.web>
    
          <authorization>
            <allow users="?"/>
          </authorization>
        </system.web>
    
      </location>
    
      <location path="Scripts">
        <system.web>
    
          <authorization>
            <allow users="?"/>
          </authorization>
        </system.web>
    
      </location>
    
      <location path="images">
        <system.web>
    
          <authorization>
            <allow users="?"/>
          </authorization>
        </system.web>
    
      </location>
    
      <location allowOverride="true">
        <system.web>
          <authentication mode="Forms">
            <forms loginUrl="~/Account/LogOn" timeout="2880" slidingExpiration="true" />
          </authentication>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
      </location>
    
      <!--END AUTHORIZATION AND AUTHENTICATION RULES-->