MVC5项目部署IIS10后登录页面无限循环及404问题求助
我最近碰到一个糟心的问题:自己开发的MVC网站用**Forms Authentication(表单认证)**做身份验证,在VS2017里不管调试还是发布运行都没问题,部署到IIS 10之后一访问就出状况——ReturnUrl无限嵌套拼接,最后变成超长URL导致404错误。
举个例子,生成的异常URL长这样:
http://MyWebSite:8080/Account/Login?ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FLogin%2525253FReturnUrl%2525253D%252525252FAccount%252525252FLogin%252525253FReturnUrl%252525253D%25252525252FAccount%25252525252FLogin%25252525253FReturnUrl%25252525253D%2525252525252FAccount%2525252525252FLogin%.....
这个URL长度能到2075字符,完全无法正常访问。
我已经做过这些确认:
- Account控制器已经添加了
[AllowAnonymous]特性,按逻辑登录页面应该允许匿名访问 - 查看IIS日志发现,初始请求后连续产生23次302重定向,每次都把当前的Login页面URL拼到ReturnUrl里,越叠越长,最终触发404。贴几段关键日志:
2018-01-31 15:58:18 10.153.60.112 GET /Account/Index - 8080 - 192.168.5.158 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 302 0 0 3
2018-01-31 15:58:18 10.153.60.112 GET /Account/Login ReturnUrl=%2FAccount%2FIndex 8080 - 192.168.5.158 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 302 0 0 3
2018-01-31 15:58:18 10.153.60.112 GET /Account/Login ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FIndex 8080 - 192.168.5.158 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 302 0 0 3
2018-01-31 15:58:18 10.153.60.112 GET /Account/Login ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FIndex 8080 - 192.168.5.158 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 302 0 0 4
2018-01-31 15:58:18 10.153.60.112 GET /Account/Login ReturnUrl=%2FAccount%2FLogin%3FReturnUrl%3D%252FAccount%252FLogin%253FReturnUrl%253D%25252FAccount%25252FLogin%25253FReturnUrl%25253D%2525252FAccount%2525252FIndex 8080 - 192.168.5.158 Mozilla/5.0+(Windows+NT+10.0;+WOW64;+Trident/7.0;+rv:11.0)+like+Gecko - 302 0 0 3
感谢社区里@stephen.vakil的提醒,问题根源出在IIS的认证配置上:我只开启了表单认证,没有启用匿名认证!
虽然代码里给Account控制器加了[AllowAnonymous],但IIS层面如果没开匿名认证,还是会拦截登录页面的请求,把用户重定向到登录页面——这就形成了死循环:请求Login页面→被拦截→重定向到Login页面并带上当前的ReturnUrl→再次被拦截→再拼一次ReturnUrl,直到URL长度超出限制触发404。
具体解决步骤:
- 打开IIS管理器,找到你的目标网站
- 点击功能视图里的认证选项
- 在认证列表里找到匿名认证,右键选择启用(表单认证保持启用状态即可)
启用匿名认证后,登录页面就能被正常访问,不会触发无限重定向,ReturnUrl的嵌套问题也就彻底解决了!
内容的提问来源于stack exchange,提问作者supermeerkat

