我有一个使用FormsAuthentication的网站,是的,cookie的名称是.ASPAUX:)
我可以完美登录。服务器创建表单身份验证票证,将其打包在cookie中,正确确定到期时间(提前1年)并将其发送给客户端。
出于某种原因,经过一段时间后,即使cookie还没有(我可以用FireCookies看到它),HttpContext.Current.Request.IsAuthenticated在服务器上变为false。就好像无法验证cookie一样。
问题是:为什么会发生这种情况?如何在没有过期的情况下调试cookie突然变为无效的原因?
修改
这是登录方法:
public static bool Login(int id)
{
try
{
string securityToken = UserHelper.AuthenticateUser(id);
DateTime expiryDate = DateTime.Now.AddYears(1);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, id.ToString(), DateTime.Now, expiryDate, true,
securityToken, FormsAuthentication.FormsCookiePath);
string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
cookie.Expires = expiryDate;
HttpContext.Current.Response.Cookies.Add(cookie);
return true;
}
catch
{
return false;
}
}
web.config:
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout="2880" slidingExpiration="true"/>
</authentication>
答案 0 :(得分:2)
在web.config中设置静态计算机密钥,以确保生成故障单时使用的加密密钥能够在回收的应用程序池中存活(或者您的网站是否在ASP.NET Web服务器中重新启动)?
另请参阅此MSDN library article
的表单身份验证票证部分答案 1 :(得分:0)
我能想到的一些事情要检查:
您是否有多个域名(包括www.domain.com
vs domain.com
)?
如果是,请将Cookie中的域设置为domain.com
,或者确保始终使用相同的域
您使用的是HTTPS吗?
如果是这样,请确保您始终通过HTTPS访问Cookie或确保Secure
上的HttpCookie
设置为false(否则只能在HTTPS请求中访问)
您是从虚拟目录编写Cookie吗?
如果是这样,可能会设置cookie上的“路径”,并且无法从路径外部访问它。
您有多个网络服务器吗?
如果是这样,请确保您的机器密钥设置为相同的值(尽管应该抛出异常)