【问题标题】:MVC Filter Action RedirectMVC 过滤器操作重定向
【发布时间】:2015-06-17 15:15:15
【问题描述】:

我已经尝试了这两种不同的方法

这种方式可行,但会在执行重定向之前处理该操作的所有代码。这会导致我们在使用防伪令牌时出现问题

    public class CheckAjaxRequestAttribute : ActionFilterAttribute
{
    private const string AJAX_HEADER = "X-Requested-With";

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null;
        if (!isAjaxRequest)
        {
            filterContext.HttpContext.Response.Redirect("/");
        }
    }
}

我看到的第二种方法推荐我收到以下错误 "不允许子动作执行重定向动作。"

        public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Buffer = true;
        bool isAjaxRequest = filterContext.HttpContext.Request.Headers[AJAX_HEADER] != null;
        string redirectUrl = string.Format("{0}://{1}/", filterContext.HttpContext.Request.Url.Scheme, filterContext.HttpContext.Request.Url.Authority);
        if (!isAjaxRequest)
        {
            //filterContext.HttpContext.Response.Redirect("/");
            filterContext.Result = new RedirectResult(redirectUrl);

        }
    }
}

这样做的目的是防止在不通过 ajax 调用时加载部分视图。代码有效,但重定向错误,当@Html.AntiForgeryToken() 抛出错误时,我们的安全扫描会发现问题。

任何帮助将不胜感激。

【问题讨论】:

  • 请为您的代码 sn-ps 中使用的编程语言添加一个标签(我假设它是 C#)。
  • 如果您取消了ChildActionOnly 属性,第二种方法将起作用。
  • 我没有使用 ChildActionOnly 属性

标签: c# asp.net-mvc actionfilterattribute


【解决方案1】:

对于您的 isAjaxRequest,您应该可以使用:

filterContext.HttpContext.Request.IsAjaxRequest();

【讨论】:

  • 感谢您的提示,我已更改我的代码以使用它,但它不能解决我的问题。
  • 对不起,我会把它放在评论而不是答案中,但我还没有评论权限。无论如何,我之前看到的方法是使用自定义 ActionMethodSelectorAttribute ("CheckAjaxRequestAttribute : ActionMethodSelectorAttribute") 并覆盖 IsValidForRequest 方法以在不是 Ajax 请求时返回 false。不幸的是,我认为如果它是错误的,它会返回一个 404,并且如果你真的需要它重定向到你的默认页面,它不会给你你想要的重定向。
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多