c# asp.net ajax session session-timeout

c# - tiempo de espera de sesión en llamada ajax



asp.net session (5)

puede configurar el tiempo de espera de la sesión expire la advertencia algo así como ....

<script type="text/javascript"> //get a hold of the timers var iddleTimeoutWarning = null; var iddleTimeout = null; //this function will automatically be called by ASP.NET AJAX when page is loaded and partial postbacks complete function pageLoad() { //clear out any old timers from previous postbacks if (iddleTimeoutWarning != null) clearTimeout(iddleTimeoutWarning); if (iddleTimeout != null) clearTimeout(iddleTimeout); //read time from web.config var millisecTimeOutWarning = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeoutWarning"]) * 60 * 1000 %>; var millisecTimeOut = <%= int.Parse(System.Configuration.ConfigurationManager.AppSettings["SessionTimeout"]) * 60 * 1000 %>; //set a timeout to display warning if user has been inactive iddleTimeoutWarning = setTimeout("DisplayIddleWarning()", millisecTimeOutWarning); iddleTimeout = setTimeout("TimeoutPage()", millisecTimeOut); } function DisplayIddleWarning() { alert("Your session is about to expire due to inactivity."); } function TimeoutPage() { //refresh page for this sample, we could redirect to another page that has code to clear out session variables location.reload(); }

Sé que esto está duplicado pero no pude obtener una solución confiable (para asp.net web).

Solo quiero redireccionar a la página de inicio de sesión si la sesión expira. He intentado seguir:

1. usando el código de estado de jquery

$.ajax({ type: "POST", url: "stream.asmx/SomeMethod", contentType: "application/json; charset=utf-8", dataType: "json", success: function (msg) { //success msg }, error: function (request, status, error) { if (status = 403) { location.href = ''login.aspx''; } } });

Problema: esto devuelve el mismo código de estado (403) para otros errores, lo cual solo espero para el tiempo de espera de la sesión.

2. Enviar mensaje json si la sesión expiró

código detrás:

if (!object.Equals(HttpContext.Current.Session["User"], null)) { Id = int.Parse(HttpContext.Current.Session["User"].ToString()); } else { result = from row in dtscrab.AsEnumerable() select new { redirectUrl = "login.aspx", isRedirect = true }; }

en el éxito de $ .ajax:

success: function (msg) { if (msg.d[0].isRedirect) { window.location.href = msg.d[0].redirectUrl; } else { //load containt } }

Problema: de alguna manera no se puede invocar la línea de éxito de ajax si la sesión expira (devuelve el json correcto). E incluso esta no es una forma adecuada si tengo muchos números de solicitud de ajax en la página (se deben manejar globalmente).

Sin embargo, vi esta publicación, que es una buena solución, pero es para mvc usando AuthorizeAttribute : handling-session-timeout-in-ajax-calls

Entonces, ¿puedo usar el mismo concepto utilizado en mvc usando AuthorizeAttribute en asp.net web api? Si no, ¿cómo puedo solucionar el problema que estoy enfrentando (cualquiera de los dos mencionados anteriormente)?


Un código de estado 403 hará que jQuery llame al método de falla. Mantenga el mismo código detrás de su segundo intento, pero mueva el manejador de redirección al método de falla en lugar del método de éxito. En el método de éxito, trátalo como lo harías normalmente.


4xx son códigos de estado de error HTTP y causarían que jquery ejecute la devolución de llamada onFailure.

Además, tenga cuidado con el uso de 3xx para los redireccionamientos cuando quiera procesar la carga útil. Internet Explorer, en mi experiencia, solo hace un redireccionamiento (sin mirar la carga útil) cuando se devuelve un código de estado 3xx.

Yo diría, lanza un 403 y maneja la situación. Para el cliente 403 implica que el acceso a los recursos está prohibido. Puede haber múltiples razones, lo cual está bien, supongo.


Problema:

Tuve el mismo problema en mi aplicación Razor MVC lanzando excepciones mientras que las llamadas ajax se realizaron cuando se agotó el tiempo de espera de la sesión.

La forma en que he logrado ordenar este problema es monitoreando cada solicitud de ajax usando un método de acción simple y ligero (RAZOR MVC) devolviendo una variable bool independientemente de si la Solicitud está autenticada o no. Por favor encuentre el código a continuación ..

Layout / Master Page / Script file:

<script> var AuthenticationUrl = ''/Home/GetRequestAuthentication''; var RedirectUrl = ''/Account/Logon''; function SetAuthenticationURL(url) { AuthenticationUrl = url; } function RedirectToLoginPage() { window.location = RedirectUrl; } $(document).ajaxStart(function () { $.ajax({ url: AuthenticationUrl, type: "GET", success: function (result) { if (result == false) { alert("Your Session has expired.Please wait while redirecting you to login page."); setTimeout(''RedirectToLoginPage()'', 1000); } }, error: function (data) { debugger; } });

})

Luego, en Controlador local / Servidor, necesita un método para verificar la solicitud y devolver la variable booleana.

public ActionResult GetAuthentication ( ) { return Json(Request.IsAuthenticated, JsonRequestBehavior.AllowGet); }

Esto validará cada solicitud de ajax y, si la sesión expiró para cualquier solicitud de ajax, alertará al usuario con un mensaje y lo redireccionará a la página de inicio de sesión.

También sugeriría no usar Alert estándar para alertar. Usuario tipo de herramienta tipo de alertas div formateadas. Las Alertas JS estándar pueden forzar al usuario a hacer clic en Aceptar antes de redireccionar.

Espero eso ayude.. :)

Gracias, Riyaz


Finalmente, terminé siguiendo.

public class IsAuthorizedAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { if (filterContext.HttpContext.Request.IsAjaxRequest()) { var sessions = filterContext.HttpContext.Session; if (sessions["User"] != null) { return; } else { filterContext.Result = new JsonResult { Data = new { status = "401" }, JsonRequestBehavior = JsonRequestBehavior.AllowGet }; //xhr status code 401 to redirect filterContext.HttpContext.Response.StatusCode = 401; return; } } var session = filterContext.HttpContext.Session; if (session["User"] != null) return; //Redirect to login page. var redirectTarget = new RouteValueDictionary { { "action", "LogOn" }, { "controller", "Account" } }; filterContext.Result = new RedirectToRouteResult(redirectTarget); } }

Manejando el lado del cliente

<script type="text/javascript"> $(document).ajaxComplete( function (event, xhr, settings) { if (xhr.status == 401) { window.location.href = "/Account/LogOn"; } }); </script>