Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使ASP.NET身份验证在重定向到登录页面时保留Url片段?_C#_.net_Asp.net_Authentication_Url - Fatal编程技术网

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

C# 如何使ASP.NET身份验证在重定向到登录页面时保留Url片段?,c#,.net,asp.net,authentication,url,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

在我将下面的配置插入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>
被重定向到

login.aspx?ReturnUrl=/Menu.aspx
login.aspx?ReturnUrl=/Menu.aspx#fragment
我希望它被重定向到

login.aspx?ReturnUrl=/Menu.aspx
login.aspx?ReturnUrl=/Menu.aspx#fragment
如何实现所需的行为?

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

编辑

你能检查一下你的IIS日志并确认一下吗?因为我99%肯定不是这样的

从我本地机器上的快速测试

  • 尝试浏览到

  • 重定向

    (注意,
    #
    不是作为重定向url的一部分转义的

  • 检查IIS的首次命中

    2010-04-12 13:36:45 W3SVCxxx 127.0.0.1 GET/formstest/private.aspx 80-详细信息被剪断-3020 0

    (注意302重定向和URL上缺少
    #test
    标记

  • 检查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-详细信息被截断-200 0

    (有200 OK HTTP响应,但仍然没有
    #test


  • 就像我说的,服务器不知道关于锚的任何信息。它只在客户端,不管你是在请求发出之前还是之后把它放进去,或者你是用JQuery更新它……它不会进入服务器。

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


    谢谢Claudio!

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


    你需要对#(%23)进行编码。我不确定这样做的最佳选择。也许你可以用重写规则来修复它?@Claudio我想重写是唯一的选择。事实上(抱歉混淆),你不认为用重写规则可以解决它。这里的问题是“内联锚”(#片段)在客户端管理,这部分url不会转到服务器。当服务器逻辑检测到您无权访问“Menu.aspx”时它重定向到登录页面,丢失了内联锚。如果我想出了任何解决方案,我会让你知道。@Claudio当然它会转到服务器。我也在尝试向下面的Eoin证明这一点。很抱歉,如果在页面请求后更改了此#片段,你是对的,但在我的情况下,#片段会发送到服务器。为什么会出现向下的vote?我已经添加了更多详细信息,解释了锚点不是请求的一部分……永远。请阅读此内容,或者尝试自己重新创建并检查IIS日志。@Eoin您向我显示了日志,但日志不完整,但是当我在
    aspx.cs
    文件中处理请求时,我可以通过
    request.Url.Fragment。如果此类信息从未到达服务器,则此类属性将不存在。@Eoin而问题恰恰是,步骤2没有按照您所描述的那样发生,
    片段
    不会出现在重定向中parameter@Jader-如果您阅读
    Fragment
    属性上的XML文档,它会说“获取转义的URI片段”…换句话说,如果它没有被转义,只是一个
    #
    文件,那么它就不起作用了…不管怎样,很高兴你有了一个URL重写规则的解决方案…你能详细介绍一下你是如何做到这一点的吗?@MCS我使用了一个字符串。在
    login.aspx.cs
    文件中进行替换这非常有效!尤其是最后一个建议,在其中添加了将window.location.hash添加到窗体的action属性上。