代码之家  ›  专栏  ›  技术社区  ›  Eoin Campbell

对重写的URL使用表单身份验证/授权

  •  3
  • Eoin Campbell  · 技术社区  · 16 年前

    我正在用一些重写的URL(取自ScottGuthrie的博客)和表单身份验证/授权进行一个快速沙盒测试。

    我有一个非常简单的设置。

    ~/View/(\d{1,6})      =>      ~/Public/View.aspx?ContentID=$1
    

    ~/Buy/(\d{1,6})       =>      ~/Private/Purchase.aspx?ContentID=$1
    

    我已经通过分别浏览以下每一项确认了URL重写的工作。

    接下来,我为web.config中的这两个目录启用了表单身份验证/授权。设置如下

      <location path="Private">
        <system.web>
          <authorization>
            <deny users="?" />
          </authorization>
        </system.web>
      </location>
      <location path="Public">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location> 
    

    当我浏览到2个原始URL(the.aspx's)时,这非常有效。 但当我浏览到重写的URL版本时,根本不会触发。

    我试图添加 <location> 截面为 Buy 但这仍然无法导致授权/身份验证模块启动。

    可能这是因为它不将这些URL视为ASPX资源…我可以通过让重写器规则

        <LookFor>~/Buy/(\d{1,6})\.aspx</LookFor>
    

    也就是说,强制重写的版本在末尾有一个ASPX,但这看起来很难看。 是否仍要使任何URL类型的身份验证处理程序被激发,而不考虑扩展名(或缺少扩展名)

    4 回复  |  直到 11 年前
        1
  •  2
  •   Dave R.    15 年前

    要使用内置身份验证,您必须根据原始的“原始”URL或重写的URL来决定是要进行身份验证。似乎您正在使用的URL重写器在执行身份验证之后连接到了一个事件,这就是为什么只遵循“public”和“private”文件夹规则的原因。如果您想基于重写的URL进行身份验证,那么您必须使用一个重写器,它钩住一个早期的事件(如beginrequest),并使用重写的URL更新web.config。

    或者,您可以插入您自己的身份验证提供者,并执行一些奇特的操作,比如检查重写的和原始的URL,但对于一个沙盒测试站点来说,这可能太过分了。

    有关详细信息,请参阅本文:

    http://msdn.microsoft.com/en-us/library/ms972974.aspx

    我希望这有帮助。

        2
  •  0
  •   Pete    15 年前

    在ASP.NET 4.0中(我相信它在3.5SP1中),包含了一个新的路由功能。使用此路由功能的好处是,它现在直接在ASP.NET中受支持,因此您可以指定在执行路由时,它应遵守实际.aspx文件的授权设置。

    所以我建议您调查一下是否可以实现这个路由特性。

        3
  •  0
  •   rtpHarry    15 年前

    不清楚您使用的是什么URL重写库,但从外观上看,我认为它可能是urlrewriter.net,但是我没有看到任何标记?

        4
  •  0
  •   bart    11 年前

    尝试对所有请求启用表单身份验证和授权。默认情况下,它仅对.aspx等ASP.NET请求启用。 可以在IIS(7)中完成,也可以直接在Web服务器/模块部分的web.config中完成。

    <system.webServer>
       <modules>
            <remove name="FormsAuthentication" />
            <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" preCondition=""/>
            <remove name="UrlAuthorization" />
            <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" preCondition="" />
       </modules>
    </system.webServer>