Kendo 网格在会话过期时不重定向到登录页面

Kendo grid not redirecting to login page when session is expired

我的网络应用程序在使用 Ajax 加载的单个页面中有许多局部视图。

我希望所有 Ajax 请求在他的 session/cookie 过期时将用户重定向到登录页面,而不是将登录页面加载到每个局部视图容器中。 Web 应用程序正在使用表单身份验证。

我已经实现了 this solution,它在大多数情况下都运行良好。

问题是,当用户刷新使用 Ajax 绑定的 Kendo 网格时,重定向不起作用。我在网络选项卡中看到重定向请求,但没有任何反应。我已尝试实现自定义授权属性并更改 http 状态代码,但如果代码不是 401,ASP.NET 框架将不会重定向。如何使重定向工作?

我的自定义授权属性不起作用。我不确定使用自定义属性是否是正确的解决方案。

public class AuthorizeUserAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Request.IsAjaxRequest())
        {
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
                filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Forbidden);
            }
            else
            {
                filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.Unauthorized);
            }

            //filterContext.Result = new HttpStatusCodeResult(System.Net.HttpStatusCode.InternalServerError);
            //filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "account", action = "logon" }));
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

只要 mvc 管道处于活动状态,您在上面 post 编辑的代码就可以工作。问题是那些 ajax 调用可以出于各种原因完全绕过您的管道,ajax 调用并不像表单 post 那样构成完整的 postback .也许您可以查看全局 ajax 处理程序并检查是否存在身份验证并根据需要重定向。据我所知,这些处理程序在任何 "lower down" 结果处理程序之前被调用。

 $(document).ajaxError(function (event, jqxhr, settings, data) {
          ...
 });
 $(document).ajaxSuccess(function (event, jqxhr, settings, exception) {
      ...
 });