我们的 ASP.NET 应用程序托管在 IIS 7.5 中,并具有以下设置:
- 主站点托管在根 IIS 文件夹下,可通过
http://siteurl
(1)访问 http://siteurl/Intranet
我们在(2)下托管的同一个 AppPool 中有一个单独的应用程序
主应用程序 (1) 与表单身份验证 (url: siteurl/loginform) 一起启用了匿名身份验证。第二个应用程序 (2) 具有集成身份验证 (NTLM)。
登录过程如下:
- 用户先去siteurl
- 用户被重定向到 /Intranet 以检查集成身份验证
- 如果集成被接受,用户将使用正确的身份验证 cookie 重定向回 siteurl 并访问该站点
- 如果集成失败,用户将被重定向到 siteurl/loginForm 以手动填写凭据
我们遇到了 Internet Explorer (8, 9, 10) 的一些问题,它拒绝在第 4 步提交表单数据。一旦为该会话开始 NTLM 协商,IE 将不会将内容发布到未经身份验证的站点似乎是一种已知行为. 我为此考虑了一些解决方法:
- 如果 POST 内容的长度为 0,则将凭据存储在 cookie 中(使用 JS)和服务器上,尝试检查 cookie 值。之后删除cookie
- 使用 GET 而不是 POST 发送凭据(很难看,因为我们需要确保用户在浏览器地址栏中看不到他刚刚发布的密码)
- 向用户提供一个链接以打开一个新选项卡并在单独的浏览器会话中继续身份验证过程(这似乎可以工作,因为 IE 会很乐意从第二个选项卡发送 POST 数据)
是否有任何其他选择可以解决这个问题?从上述 3 中,哪一个更可取,我们可能会遇到哪些未考虑的陷阱?