Ответ 1
У меня тоже была такая же проблема. На самом деле, это произошло потому, что я не мог прочитать cookie проверки подлинности форм из javascript, это было через некоторое время undefined
. Я просто хотел узнать, была ли я аутентифицирована через javascript.
Позже я обнаружил, что билет истек, но я не выходил из системы (также, поэтому я тоже хотел это решить)! Я видел, что на ваш вопрос не был дан ответ, поэтому я оставил его открытым, пока я работал над своими проблемами полдня. Следующее - это то, с чем я столкнулся, что, похоже, работает.
Мой ответ основан на этом ответе. fooobar.com/questions/166721/... пользователем СкоттС
Это в моем проекте 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://stackoverflow.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 сохраняли билет (обращается к моей проблеме с файлом javascript, а не к проблеме бездействия выхода из системы). * (подсказка, если вы выйдете из системы, а затем войдите в систему, но снова вернитесь на страницу входа в систему, первый логин, возможно, не указал returnUrl в querystring). *
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>