通知ajax调用会话已超时或用户需要重新进行身份验证

时间:2014-05-09 03:22:20

标签: c# ajax asp.net-mvc asp.net-mvc-4 kendo-ui

我已经为我挑战了一个挑战,即当请求是ajax时,能够记录并继续/通知用户有关服务器异常的信息。使用基本控制器中的OnException并查找作为ajax的请求,我可以返回要呈现的自定义“... uhoh”视图。

现在,我正在与未经过身份验证的部分进行斗争。我正在努力使用这个修改过的代码,而我正在考虑使用这个代码替换基类中的[Authorize]属性。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public class AjaxAuthorizeAttribute : AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAjaxRequest())
            {
                filterContext.Result = new JsonResult{Data = new{NotAuthenticated=1}, JsonRequestBehavior = JsonRequestBehavior.AllowGet};
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }

目前,有一些领域可能会将NotAuthenticatedas数据返回给客户端中的Ajax调用。我是以正确的方式来做这件事的吗?刚刚找到以Ajax结尾的主要流程。

if(returnData.NotAuthenticated){
    if (that.onNotAuthenticated != null)
       that.onNotAuthenticated();
    else
      _loadView(viewElement, "Request requires authorization. Please login again.");
} else
      _loadView(viewElement, returnData);
}

但是,我正在使用Kendo完整的库以及其他可能的库。当通过Ajax调用触发时,是否有更好的“全局”方式来处理会话超时或auth重定向?

请帮忙!

1 个答案:

答案 0 :(得分:3)

我认为Global Ajax Event Handlers符合您的需求。例如,下面的代码设置了一个全局错误处理程序,如果她的会话超时,它将把用户重定向到登录页面。

$(document).ajaxError(function (event, jqxhr, settings, exception) {
    if (jqxhr.status == 401 || jqxhr.statusText == "Unauthorized") {
        window.location.href = '/login';
    }
});