首页 > 解决方案 > 会话过期时,Kendo 网格不会重定向到登录页面

问题描述

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

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

我已经实现了这个解决方案,它在大多数情况下都可以正常工作。

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

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

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);
        }
    }
}

标签: c#asp.netasp.net-mvckendo-gridkendo-asp.net-mvc

解决方案


只要 mvc 管道处于活动状态,您在上面发布的代码就可以工作。问题是那些 ajax 调用可以出于各种原因完全绕过您的管道,ajax 调用不像表单发布那样构成完整的回发。也许您可以查看全局 ajax 处理程序并检查是否存在身份验证并根据需要进行重定向。据我记得,这些处理程序在任何“下层”结果处理程序之前被调用。

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

推荐阅读