yo también tenía el mismo problema. En realidad, se produjo porque no pude leer la cookie de autenticación de formularios de javascript, fue después de un tiempo undefined
. Solo quería saber si me autenticaron a través de JavaScript.
Más tarde descubrí que el ticket había expirado, pero no me estaban desconectando (¡también, así que quería resolverlo también)! Vi que su pregunta no había sido respondida, así que la mantuve abierta mientras resolvía mis problemas durante medio día. Lo siguiente es lo que se me ocurrió que parece estar funcionando.
Mi respuesta se basa en esta respuesta. https://stackoverflow.com/a/454639/511438 por usuario ScottS
Esto está en mi proyecto ASP.NET MVC 3.
Aquí está mi código de inicio de sesión. No se muestra, la lógica de autenticación de usuario personalizada anterior. Esto solo establece el ticket inicial.
FormsAuthenticationService clase pública: 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);
}
en la misma clase, pero un método estático que se accede desde 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
Mi personalización proviene de que las solicitudes ajax no actualizan el ticket de autenticación de formularios. Entonces, si te sientas allí durante el tiempo de espera, una solicitud de Ajax te desconectará. Cámbialo si quieres que las solicitudes ajax mantengan vivo el ticket (se dirige a mi problema de cookies de JavaScript, no a tu problema de inactividad). * (consejo, si se cierra la sesión, luego inicia sesión, pero vuelve a la página de inicio de sesión, el primer inicio de sesión no especificó una returnUrl en la cadena de consulta). *
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 aquí es la parte en la que poner el tiempo de sesión y el tiempo de espera de entradas
<configuration>
<system.web>
<sessionState mode="InProc" timeout="60" />
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="60" name="ProviderMvcSession" cookieless="UseCookies" />
</authentication>
Pero el estado de la sesión es independiente de la cookie AuthenticationTicket/.ASPXAUTH. Al menos creo que es ?! – bplus
si no está utilizando cookies para almacenar estos datos, entonces la sesión es responsable de cuidarlo. –
¡Pero estoy usando cookies! Tengo cookieless = "UseCookies". Gracias por responder. Estoy realmente confundido por esto, tu sugerencia funciona pero ¿no sé por qué? – bplus