C# 如何使ASP.NET身份验证在重定向到登录页面时保留Url片段?
在我将下面的配置插入Web.Config之后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
<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的一部分转义的#test
标记#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属性上。