Internet Explorer 中的 asp.net 表单身份验证问题
Posted
技术标签:
【中文标题】Internet Explorer 中的 asp.net 表单身份验证问题【英文标题】:Problem with asp.net forms authentication in internet explorer 【发布时间】:2009-07-24 18:54:53 【问题描述】:我的公司有一个托管在客户端机器上的 Web 应用程序,它使用 ASP.net 中的表单身份验证。当访问网站http://www.client.com/Application 并尝试在登录页面上进行身份验证时,用户会被重定向回登录页面。当通过http://localhost/Application 访问它时,身份验证工作正常并且用户能够进入该站点。我们无法在我们的开发环境中复制这种行为,所以我们很确定这与他们的服务器/环境有关。
该问题仅在使用 Internet Explorer 时发生(使用 ie 6、7、8 测试)。当客户端尝试使用 firefox 时,身份验证工作正常。
我创建了一个调试页面,在调用 FormsAuthentication.SetAuthCookie 后登录页面重定向到该页面,该页面显示有关身份验证 cookie 的信息。在 Internet Explorer 中点击它时,身份验证 cookie 不存在。当在 FireFox 中点击它时会。
以前有没有人遇到过类似的情况,或者对可能出现的问题有什么建议?
编辑:
Web.config
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="Login.aspx" />
</authentication>
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
<!-- Page used to display authentication cookie information -->
<location path="AuthDebugPage.aspx">
<system.web>
<authorization>
<allow users="?"/>
</authorization>
</system.web>
</location>
LogOn.aspx.vb
If (adAuth.IsAuthenticated(Domain, txtUserName.Text, txtPassword.Text)) Then
Dim AuthDebug As Boolean = System.Configuration.ConfigurationSettings.AppSettings("AuthDebug")
If AuthDebug Then
FormsAuthentication.SetAuthCookie(SystemUserName, False)
Response.Redirect("AuthDebugPage.aspx")
Else
FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, False)
End If
End If
他们域的管理员查看了组策略,以查看他们是否将任何内容推送到其节点,从而阻止用户在 IE 上接受 cookie,但他没有找到任何东西。他还将一台机器从域中取出并清除了所有组策略,但在 Internet Explorer 中进行身份验证时仍然遇到同样的问题。
【问题讨论】:
也许一些 auths 可以帮助阐明这一点的代码的 sn-ps? 你在web.config的forms认证节点中设置了域值吗? 你能从 web.config 复制并粘贴整个 部分吗? 是不是人们有某种域策略设置不允许 IE 中的 cookie? 添加了身份验证代码和 web.config 的部分内容以发布和解决域策略问题。 web.config 的表单身份验证节点中没有设置域值 【参考方案1】:当服务器日期/时间不正确并导致 AuthCookie 到期日期不正确时,我遇到了同样的问题。
检查服务器的日期/时间是否正确。
【讨论】:
【参考方案2】:正如约翰所说,这是一种环境因素。我们打开了无 cookie 身份验证,它工作得很好,因此用户得到了正确的身份验证。我们的一位客户发现,当他们仅使用 IP 地址访问网站(例如 http://111.111.111.111)时,网站运行正常,他们能够通过登录页面,但当他们使用 DNS 名称时却没有。结果他们在 Internet Explorer 中的区域确实允许对外部站点(DNS 名称也解析)足够的信任,因为它允许本地 Intranet 站点拥有 cookie。
【讨论】:
这似乎指出了问题,但确切的解决方案是什么?我现在处于同样的情况,但我不能要求我的客户使用 IP 地址而不是 DNS。 我仔细检查了我的 DNS,其中有一个下划线。对于那些到达这里的人,您也可以查看此post。【参考方案3】:我正在开发的网站在使用所有 IE 登录时都遇到了类似的问题,但只有一个从 Win 7 运行。
实际的问题是我使用的主机名有下划线,不应该使用。也许某些 Windows 策略会阻止为无效主机创建 cookie。
【讨论】:
见***.com/questions/3144394/…【参考方案4】:作为一般规则,自 2002 年以来 Microsoft .NET 中的 Forms Authentication 极不可能与 Microsoft Internet Explorer 中断。这显然是环境问题。
要做的事情是用 Fiddler 或其他东西观察网络,看看发生了什么。然后用 Firefox 做同样的事情,然后比较。
一旦你看到了差异,试着弄清楚这种差异是如何被限制在 IE 上的。
【讨论】:
我认为这不是一个真正可行的解决方案,因为服务器在他们的控制之下,并且该服务器的管理员会在 fiddler 上进行 o.O。 如果你不找出问题所在,我看不出你如何解决问题。【参考方案5】:说到 IIS,您是否检查过 IIS 尝试在站点实例上使用的身份验证方法?我相信 Firefox 会说服 IIS 使用“基本”身份验证,而 IE 会尝试使用其花哨的 Windows 身份验证等。
另外,您是否在 HOSTS 文件中指定了站点的 IP/主机名?这可能会以某种方式产生影响(有时好,有时坏)。
【讨论】:
【参考方案6】:就像 ajh1138 所说,IE 可能正在协商“集成身份验证”,而 FireFox 正在使用 HTTP 身份验证或普通的旧表单-POST。
IE 可能会映射到实际的 Windows 用户名(例如运行 IE 的用户),并且该用户可能无权访问该网页(即使匿名用户可以访问)。这可能会产生您描述的行为。
【讨论】:
【参考方案7】:这样使用:
int timeoutValue = 20; // This value is actually returned from a method;
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(txtLogin.Text, false, timeoutValue);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
authCookie.Domain = "uptime.com.br";
authCookie.Expires = DateTime.Now.AddMinutes(timeoutValue);
HttpContext.Current.Response.Cookies.Add(authCookie);
【讨论】:
以上是关于Internet Explorer 中的 asp.net 表单身份验证问题的主要内容,如果未能解决你的问题,请参考以下文章
Telerik asp.net mvc datepicker Internet Explorer (IE) 8 中的“无效参数”
Internet Explorer 缓存 asp.net mvc ajax 结果
ASP.NET:Internet Explorer 和 Firefox 之间的 Gridview 图像问题
ASP.NET MVC Razor Url.Action 在 Internet Explorer 8 中不起作用
ASP.NET 2.0 自定义客户端验证在 Internet Explorer 中不起作用
ASP.NET MVC Kendo UI Edit Popup Internet Explorer Date Edit Problems