Почему мои бланки проверки подлинности истекают так быстро?
Я использую проверку подлинности форм в приложении ASP.NET. Я настраиваю 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>
...
Что-то не так с моим подходом? Почему это так быстро истекает?
ИЗМЕНИТЬ
Код Global.asax:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (Request.PhysicalPath.EndsWith(".aspx") || Request.PhysicalPath.EndsWith(".axd") || Request.PhysicalPath.EndsWith(".ashx"))
SecurityManager.SetPrincipal();
}
SetPrincipal Code:
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
Это ваша проблема.
<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate"
validation="SHA1"/>
ASP будет генерировать новый машинный ключ каждый раз при повторном использовании пула приложений. Что может разумно происходить каждый час.
Ключ машины используется для шифрования и расшифровки вашего файла cookie FormsAuthentication. Если он изменится, cookie в вашем браузере больше не будет хорошим. Таким образом, система будет относиться к вам так, как если бы вы никогда не вошли в систему.
Попробуйте создать статический ключ и добавить его в файл конфигурации. Должен выглядеть примерно так:
<machineKey
validationKey="21F090935F6E49C2C797F69(snip)F1B72A7F0A281B"
decryptionKey="ABAA84D7EC4BB56D75D(snip)B8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>
Создайте ключ здесь.
Ответ 2
Я не вижу ничего плохого в коде. Какой браузер вы используете, возможно, он не признает срок годности 1 год? Я бы посмотрел заголовки ответов с помощью скрипача или какого-нибудь такого инструмента и посмотрел, что действительно отправлено.
Ответ 3
Это может помочь http://support.microsoft.com/kb/910439/
Я предполагаю, что файл cookie истекает перед билетом. В приведенной выше статье показаны способы отладки, чтобы убедиться, что это действительно так.
Ответ 4
Единственное, что я вижу, является нестандартным, так это то, что вы передаете id.ToString() в конструктор FormsAuthenticationTicket. Я обычно передаю имя пользователя в этом параметре. Не уверен, будет ли это иметь значение, но стоит попробовать.
Ответ 5
Используете ли вы что-либо еще в своем приложении, которое может вызвать таймаут?
Автоматически вывести вас из системы, если, например, заканчиваются состояния сеанса proc.
Я предполагаю, что у вас есть код в вашем Global.asax для обработки аутентифицированного запроса тоже?