Тайм-аут не работает в ASP.Net MVC FormsAuthentication
Я использую FormsAuthentication, у меня проблемы с установкой значения TimeOut.
Я видел некоторые другие сообщения, связанные с этим, но они, кажется, не совсем моя проблема, или предлагаемое решение не помогает.
Мой web.config имеет следующее:
<authentication mode="Forms">
<forms loginUrl="~/Account/LogOn"
timeout="1"
cookieless="UseCookies" />
</authentication>
Я поместил AuthorizeAttribute на контроллеры, которые я хочу защитить.
Я могу просмотреть файл cookie .ASPXAUTH (используя FireCookies), и я вижу, что срок его действия истекает через 1 минуту после входа в систему.
Если я отлаживаю свой код, я вижу, что FormsAuthentication.Timeout = 1.
Однако мой билет, кажется, не истекает через 1 минуту. После 1 минуты бездействия я все еще могу просматривать контроллеры с AuthorizeAttribute.
На самом деле я могу удалить cookie-файл.ASPXAUTH с помощью FireCookies и по-прежнему могу просматривать контроллеры с помощью AuthorizeAttribute.
Причудливо после долгой неактивности (извините, у меня нет точного времени - я был на обеде!) Происходит TimeOut, и я перенаправлен на экран входа в систему.
Есть идеи?
3 ответа
У меня тоже была такая же проблема. На самом деле, это произошло потому, что я не мог прочитать cookie проверки подлинности форм из JavaScript, это было через некоторое время undefined
, Я просто хотел узнать, прошел ли я аутентификацию через javascript.
Позже я обнаружил, что срок действия билета истек, но я не выходил из системы (также. Поэтому я тоже хотел решить эту проблему)! Я увидел, что на ваш вопрос не было ответа, поэтому я оставил его открытым, пока решал свои проблемы в течение полдня. Следующее - то, что я придумал, это, кажется, работает.
Мой ответ основан на этом ответе. /questions/15156955/kuki-fajlyi-aspnet-autentifikatsiya-i-vremya-ozhidaniya-seansa/15156970#15156970 от пользователя ScottS
Это в моем проекте ASP.NET MVC 3.
Вот мой код для входа. Не показано, пользовательская логика аутентификации пользователя перед ним. Это просто устанавливает начальный билет.
открытый класс FormsAuthenticationService: IFormsAuthentication
public void SignIn(string userName, bool createPersistentCookie, string role)
{
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1, // version
userName, // user name
DateTime.Now, // created
DateTime.Now.Add(FormsAuthentication.Timeout), // expires
false, // rememberMe?
role // can be used to store roles
);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
HttpContext.Current.Response.Cookies.Add(authCookie);
}
в том же классе, но статический метод, который доступен из global.asax
//-- this is based on https://stackru.com/questions/454616/asp-net-cookies-authentication-and-session-timeouts
internal static FormsAuthenticationTicket RefreshLoginCookie(bool retainCurrentExpiry)
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == null)
return null;
FormsAuthenticationTicket oldTicket = FormsAuthentication.Decrypt(authCookie.Value);
DateTime expiryDate = (retainCurrentExpiry ? oldTicket.Expiration : DateTime.Now.Add(FormsAuthentication.Timeout));
HttpContext.Current.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
var newTicket = new FormsAuthenticationTicket(oldTicket.Version, oldTicket.Name, oldTicket.IssueDate, expiryDate,
oldTicket.IsPersistent, oldTicket.UserData, oldTicket.CookiePath);
HttpCookie newAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newTicket));
HttpContext.Current.Response.Cookies.Add(newAuthCookie);
return newTicket;
}
Global.asax
Моя настройка приходит, что запросы ajax не обновляют билет проверки подлинности форм. Так что, если вы сидите там в течение периода ожидания, запрос Ajax выйдет из вас. Измените это, если вы хотите, чтобы запросы ajax поддерживали заявку (решает мою проблему с файлами cookie javascript, а не проблему отсутствия активности при выходе из системы). *(подсказка, если вы вышли из системы, затем войдите в систему, но вернитесь на страницу входа снова, при первом входе в систему, возможно, не указывается returnUrl в строке запроса). *
protected virtual void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{
return;
}
bool isAjax = new HttpRequestWrapper(System.Web.HttpContext.Current.Request).IsAjaxRequest();
FormsAuthenticationTicket authTicket;
try
{
//-- THIS IS WHAT YOU WANT
authTicket = FormsAuthenticationService.RefreshLoginCookie(isAjax);
}
catch
{
return;
}
string[] roles = authTicket.UserData.Split(';');
if (Context.User != null) Context.User = new GenericPrincipal(Context.User.Identity, roles);
}
Web.config - это та часть, где я устанавливаю время ожидания сеанса и время билета
<configuration>
<system.web>
<sessionState mode="InProc" timeout="60" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
</authentication>
Очевидное решение, которое могут легко найти некоторые люди, очистка файлов cookie браузера или выход из системы, должны решить эту проблему. Если установлен флажок Запомнить меня, приложение будет продолжать входить со старым файлом cookie независимо от изменений, внесенных в значение тайм-аута Web.Config.
Это о том, как долго время вашей сессии. По умолчанию это 20 минут, и вы можете изменить его в web.config следующим образом:
<sessionState mode="InProc" timeout="20"/>