ASP.NET FormsAuthentication登录跳转哈希传递机制及动态登录URL实现咨询
核心结论
你观察到的重定向后哈希值保留的效果,不是ASP.NET FormsAuthentication做的特殊处理,完全是浏览器的原生默认行为。
原理说明
- URL中
#及后续的内容属于哈希片段,按照HTTP规范设计为仅客户端使用,永远不会随HTTP请求发送到服务端,因此你在Fiddler等抓包工具中看不到哈希是正常现象,服务端从始至终都无法直接获取这部分内容。 - 当你访问需验证的地址
https://localhost:44360/directors#events/event?eventid=169830时,浏览器实际发送到服务端的请求地址只有https://localhost:44360/directors,哈希部分被浏览器保存在本地。 - 服务端身份校验未通过后,返回302重定向响应,响应头的
Location字段仅携带不带哈希的登录地址:https://localhost:44360/login?ReturnUrl=%2fdirectors,响应内容本身完全不涉及哈希相关信息。 - 浏览器处理302重定向响应时,会自动将本地留存的原地址哈希片段,追加到重定向后的新URL末尾,最终地址栏显示的就是你看到的携带哈希的登录地址
https://localhost:44360/login?ReturnUrl=%2fdirectors#events/event?eventid=169830。
自定义动态登录URL实现方案
- 如果你只需要和默认FormsAuthentication一致的哈希保留效果:无需做任何额外服务端开发,只要你返回的302重定向
Location头中不包含自定义哈希值,浏览器就会自动完成哈希的追加逻辑。 - 如果你需要在服务端获取哈希值做特殊逻辑处理:由于服务端本身无法直接拿到哈希,需要前端辅助实现:在前端请求需要验证的资源前,通过JS读取
location.hash,将哈希内容编码后作为查询参数附加到请求地址中,服务端拿到该参数后再按需拼接到登录地址的对应位置即可。
内容的提问来源于stack exchange,提问作者Mike Flynn
相关产品推荐
相关产品推荐

