【发布时间】: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