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

时间:2019-05-03 16:46:43

标签: c# asp.net asp.net-mvc kendo-grid kendo-asp.net-mvc

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

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

我已经实现了this solution,并且在大多数情况下都可以正常工作。

问题是当用户刷新使用Ajax绑定的Kendo网格时,重定向不起作用。我在网络标签中看到了重定向请求,但没有任何反应。我尝试实现自定义Authorize属性并更改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);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

只要mvc管道处于活动状态,您上面发布的代码将起作用。问题是那些ajax调用可能由于各种原因而完全绕过您的管道,一个ajax调用不会像表单发布那样构成完整的回发。也许您可以调查全局ajax处理程序并检查是否存在身份验证,然后根据需要重定向。据我所知,这些处理程序在任何“低级”结果处理程序之前被调用。

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