ASP.NET MVC - 无法在Response.Redirect中加载资源

时间:2012-02-15 15:38:26

标签: asp.net-mvc-3 forms-authentication

我注意到如果我的会话在我的网站上过期,然后我点击了Ajax.ActionLink,登录页面将显示在PartialView中。我已经创建了OnActionExecuting方法的覆盖,如下所示:

    protected override void OnActionExecuting(ActionExecutingContext ctx)
    {
        if (!ctx.HttpContext.User.Identity.IsAuthenticated)
        {
            if (ctx.RequestContext.HttpContext.Request.IsAjaxRequest())
            {
                //ctx.RequestContext.HttpContext.Response.RedirectToRoute(new { controller = "Account", action = "LogOn" });
                ctx.RequestContext.HttpContext.Response.Redirect(Url.RouteUrl(new { controller = "Account", action = "LogOn" }));
            }
        }
    }

检查用户是否经过身份验证,然后检查请求是否为AjaxRequest。然后,如果不再对Ajax actionlink进行身份验证,则会将用户重定向到我的Account控制器中的LogOn方法。问题是我在控制台中“无法加载资源”。

1 个答案:

答案 0 :(得分:1)

  

检查用户是否已通过身份验证,然后检查请求是否为   AjaxRequest。然后它会将用户重定向到我的LogOn方法   帐户控制器,如果他们不再为Ajax进行身份验证   ActionLink的

是的,但是如果您使用Ajax.ActionLink配置了Ajax.BeginFormAjaxOptions以使用AJAX请求的结果更新某些DOM元素,那么无论您是重定向到服务器上。 AJAX请求将简单地遵循重定向并将重定向的结果HTML插入DOM元素内的(/ Account / LogOn)。

因此,从AJAX请求重定向将无法解决您的问题。如您所知,AJAX请求的重点是保持在同一页面上(地址栏永远不会改变)。

如果您想在AJAX请求中以正确的方式处理身份验证Cookie过期条件,则必须在客户端上执行重定向(使用window.location.href)。为了实现这一目标,您可以查看一下following blog post,其中Phil Haack公开了一项很棒的技术,允许您的服务器在这种情况下发送401 HTTP状态代码而不是重定向。然后在客户端上,您可以拦截此代码(例如,通过订阅全局AJAX处理程序)并从客户端重定向到登录页面。