2015-09-09 3 views
0

Я использую фильтр для проверки подлинности пользователя. Если не нужно перенаправлять страницу входа.Не перенаправляется на страницу входа после окончания сеанса в mvc4

public class CookieAuthorizeAttribute : AuthorizeAttribute 
{ 
protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var authorized = base.AuthorizeCore(httpContext); 
     if (authorized) 
     { 
      FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 
      System.Web.Security.FormsAuthentication.RenewTicketIfOld(identity.Ticket); 

      return true; 
     } 
     else 
     { 
      httpContext.Items["redirectToCompleteProfile"] = true; 

      return false; 
     } 

    } 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext.HttpContext.Items.Contains("redirectToCompleteProfile")) 
     { 
      var routeValues = new RouteValueDictionary(new 
      { 
       controller = "Login", 
       action = "Login", 
      }); 
      filterContext.Result = new RedirectToRouteResult(routeValues); 
     } 

    } 


} 

}

Даже если код входа Войти контроллер, перенаправление не работает. Запрос исходит от javascript.

ответ

0

В вашем файле Global.asax.cs вы можете получить запрос ajax с помощью context.Request.IsAjaxRequest и использовать событие Application_PostAuthenticateRequest.

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{ 
    var context = new HttpContextWrapper(Context); 

    if(context.User == null || !context.User.Identity.IsAuthenticated) 
    { 
     if(context.Request.IsAjaxRequest()) 
     { 
      var loginPageUrl = UrlHelper.GenerateUrl(null, "Login", "Account", null, RouteTable.Routes, HttpContext.Current.Request.RequestContext, false); 
      var serializer = new JavaScriptSerializer(); 

      Response.Clear(); 
      Response.TrySkipIisCustomErrors = true; 
      Response.ContentType = "application/json"; 
      Response.StatusCode = (Int32)HttpStatusCode.Unauthorized; 
      Response.Write(serializer.Serialize(new 
      { 
       Url = Request.UrlReferrer.AbsolutePath, 
       LoginUrl = loginPageUrl 
      })); 
      Response.End(); 
     } 
     return; 
    } 
} 

и в вашем JavaScript, вы можете иметь глобальный обработчик для этих ошибок, как

$(document).ajaxError(function (event, jqxhr, settings, thrownError) { 
    if (jqxhr.status == 401) { 
     var errorObject = $.parseJSON(jqxhr.responseText); 
     var pageUrl = errorObject.Url; 
     var loginUrl = errorObject.LoginUrl; 
     window.location = loginUrl + "?ReturnUrl=" + pageUrl; 
     event.stopImmediatePropagation(); 
     return; 
    } 
} 
+0

он работал спасибо :) – dlearner

0

В перенаправлении переадресации вызова ajax не будет работать, он просто вернет имя входа в систему html в качестве ответа на вызов ajax.

Вы должны проверить, если это Аякс статус запроса возврата и URL, на который следует перенаправить в формате JSON:

if (filterContext.HttpContext.Items.Contains("redirectToCompleteProfile") && !context.HttpContext.Request.IsAjaxRequest()) 
{ 
    var routeValues = new RouteValueDictionary(new 
    { 
     controller = "Login", 
     action = "Login", 
    }); 
    filterContext.Result = new RedirectToRouteResult(routeValues); 
} 
else 
{ 
    filterContext.HttpContext.Response.StatusCode = 403; 
    filterContext.Result = new JsonResult 
           { 

            Data = "LogOut", 
            JsonRequestBehavior = JsonRequestBehavior.AllowGet 
           }; 
} 

и в вашем основном макете, вы можете написать:

$(document).ajaxError(function(e, xhr, opts) { 

      console.log(xhr.status); 
      if (xhr.status == 403 && && xhr.responseText.indexOf("LogOut") != -1) { 

       window.location.href = "@Url.Action("Login", "Login")"; 
      } 

     }); 
Смежные вопросы