我们的 ASP.NET 4.0 应用程序的表单身份验证设置为 cookieless="AutoDetect"。我注意到,如果用户为我们的登录页面添加书签,书签链接将设置为 https://hostname.com/Login.aspx?AspxAutoDetectCookieSupport=1。如果用户直接从新的浏览器会话导航至此并执行有效登录,则不会设置 cookie。如果我直接导航到该页面,但从查询字符串中删除 AspxAutoDetectCookieSupport,则可以正确创建 cookie。
如果用户直接导航到 Default.aspx 或根目录,即使在查询字符串中添加 AspxAutoDetectCookieSupport=1,登录功能也能正常运行。
当用户单击登录按钮时,我们会回发到登录页面,并根据我们的数据库手动检查用户凭据。如果成功,我们会:
FormsAuthentication.RedirectFromLoginPage(userName, false);
我花了很多时间对此进行调试,包括查看参考源中的 ASP.NET 表单身份验证代码,但无法确定导致此问题的原因。目前我们唯一的解决方案是告诉用户从书签 URL 中删除登录页面,并在登录页面上添加一个书签按钮以供用户单击。
是否有其他解决方案来解决此表单身份验证问题?这是表单身份验证吗?
这里的问题是,无论是否提供重定向位置,您始终使用 RedirectFromLoginPage。如果未提供,则重定向将失败。对此的正确解决方案是检查重定向 url,如果它不可用,则重定向到 default.aspx(源示例借自此博客文章):
// Once the user's entered credentials are verified //
if(Request.Params["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(txtUserName.text, false);
}
else
{
FormsAuthentication.SetAuthcookie(txtUserName.text, false);
Response.Redirect("Default.aspx");
}
要删除此设置,请将 web.config 中 sessionState 的 cookieless 属性添加为 false。
<configuration>
<system.web>
<sessionState mode="InProc" cookieless="UseCookies" timeout="20" />
</system.web>
</configuration>
或
<configuration>
<system.web>
<sessionState mode="InProc" cookieless="false" timeout="20" />
</system.web>
</configuration>