在重定向到登录页面时,如何使ASP.NET身份验证保留Url Fragment?

时间:2010-04-09 20:02:11

标签: c# .net asp.net authentication url

在我的Web.Config

中插入以下配置后
<authentication mode="Forms">
  <forms name="appNameAuth"
   path="/" loginUrl="login.aspx" protection="All" timeout="30">
    <credentials passwordFormat="Clear">
      <user name="user" password="password" />
    </credentials>
  </forms>
</authentication>
<authorization>
  <deny users="?" />
</authorization>

所有要求

Menu.aspx#fragment

被重定向到

login.aspx?ReturnUrl=/Menu.aspx

我预计它会被重定向到

login.aspx?ReturnUrl=/Menu.aspx#fragment

如何达到预期的行为?

3 个答案:

答案 0 :(得分:5)

#fragment锚标记是URL的客户端(浏览器)组件。据我所知,它并没有被发送到WebServer,因此服务器端对重定向没有任何线索。

修改

您可以检查您的IIS日志并确认,因为我99%确定不是这种情况。

在本地机器上进行快速测试。

  1. 尝试浏览

    http://localhost/formstest/private.aspx#test

  2. 获取重定向

    http://localhost/formstest/login.aspx?redirect=http%3a%2f%2flocahost%2fformstest%2fprivate.aspx#test

    (请注意,#未作为重定向网址的一部分进行转义。

  3. 检查IIS是否第一次点击。

    2010-04-12 13:36:45 W3SVCxxx 127.0.0.1 GET /formstest/private.aspx 80 - DETAILS SNIPPED - 302 0 0

    (注意302重定向和URL上#test令牌的缺席

  4. 检查IIS是否有重定向匹配。

    2010-04-12 13:36:46 W3SVCxxx 127.0.0.1 GET /formstest/login.aspx redirect = http%3a%2f%2flocahost%2fformstest%2fprivate.aspx 80 - DETAILS SNIPPED - 200 0 0

    (这是你的200 OK HTTP响应,但仍然没有#test

  5. 就像我说的那样,服务器对#anchor一无所知。它只在客户端,无论是在请求发出之前还是之后放入,或者是否使用JQuery更新它...它都不会发送到服务器。

答案 1 :(得分:2)

我发现使用IIS URL重写规则对我不起作用。但是,以下链接提供的解决方案非常有效:

http://codetunnel.io/how-to-persist-url-hash-fragments-across-a-login-redirect/

答案 2 :(得分:1)

到目前为止,我找到的唯一解决方案是使用重写规则将#字符编码为%23

谢谢克劳迪奥!