C# 为什么我的表单验证票证过期得这么快?
我正在ASP.NET应用程序中使用窗体身份验证。我将C# 为什么我的表单验证票证过期得这么快?,c#,.net,asp.net,authentication,forms-authentication,C#,.net,Asp.net,Authentication,Forms Authentication,我正在ASP.NET应用程序中使用窗体身份验证。我将FormsAuthenticationTicket配置为在1年内过期,但实际上在1小时左右后过期。我不明白为什么 以下是登录过程中涉及的所有代码: public static bool Login(int id) { try { string securityToken = UserHelper.AuthenticateUser(id); DateTime expiryDate = DateTi
FormsAuthenticationTicket
配置为在1年内过期,但实际上在1小时左右后过期。我不明白为什么
以下是登录过程中涉及的所有代码:
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:
<system.web>
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate" validation="SHA1" />
<compilation debug="true">
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" timeout="2880"/>
</authentication>
...
SetPrincipal代码:
public static void SetPrincipal()
{
ILivrePrincipal principal = null;
FormsIdentity identity;
UrlParameters urlParameters = UrlParametersHelper.GetUrlParameters(HttpContext.Current.Request);
if (HttpContext.Current.Request.IsAuthenticated)
{
identity = (FormsIdentity)HttpContext.Current.User.Identity;
User userProfile;
urlParameters.SecurityToken = (((FormsIdentity)identity).Ticket).UserData;
try
{
userProfile = UserHelper.GetUser(urlParameters.SecurityToken);
UserHelper.UpdateLastActiveOn(userProfile);
principal = new AuthenticatedPrincipal(identity, userProfile);
}
catch
{
//TODO: Log an exception
FormsAuthentication.SignOut();
principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
}
}
else
{
principal = new AnonymousPrincipal(new GuestIdentity(), UserHelper.GetUser(null));
}
HttpContext.Current.User = principal;
}
我看代码没有任何问题。您使用的是什么浏览器,可能它不识别1年的到期日期?我会使用fiddler或类似工具查看响应头,并查看实际发送的内容。我唯一能看到的非标准内容是,您正在将id.ToString()传递给FormsAuthenticationTicket构造函数。我通常在此参数中传递用户名。不确定这是否会产生影响,但值得一试。您的应用程序中是否使用了其他可能导致超时的内容? 例如,在进程内会话状态过期时自动注销 我假设您的Global.asax中也有一些代码来处理经过身份验证的请求?这可能会有所帮助 我猜饼干在票到期之前就过期了。上面的文章向您展示了调试的方法,看看是否确实如此。这就是您的问题所在
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate"
validation="SHA1"/>
ASP将在每次应用程序池回收时生成一个新的机器密钥。每小时都有可能发生
机器密钥用于加密和解密FormsAuthenticationCookie。如果它发生变化,浏览器上的cookie将不再有效。因此,系统会将您视为从未登录
尝试生成静态密钥并将其添加到配置文件中。应该是这样的:
<machineKey
validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"
decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>
为自己生成一个密钥。为什么有
timeout=“2880”
(指定2天)?@Gabe谢谢。我同意你的看法。这是一个错误,但仍然无法解释为什么我的登录会话将在大约一小时后过期。我发现任何浏览器都有问题,响应头是什么样子的?我同意首先要查看原始cookie/流量。Firefox与Firebug和Firecookie插件是一个很好的解决问题的方法(这就是我调试表单身份验证问题的方式)。我认为我没有使用任何会导致超时的东西。我添加了有关身份验证代码的更多信息。
<machineKey
validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"
decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>