Asp.net mvc 4 忽略对操作的非ajax请求

Asp.net mvc 4 忽略对操作的非ajax请求,asp.net-mvc-4,Asp.net Mvc 4,我希望只有在XHR对象的请求下,操作才能用于性能。当我试图意识到: 在控制器中有一个操作: public string Act() { string view=""; if(Request.Headers["p"]!="p") Response.Redirect("/",true); else view = GetActView(); retu

我希望只有在XHR对象的请求下,操作才能用于性能。当我试图意识到: 在控制器中有一个操作:

      public string Act()
        {     
         string view="";
        if(Request.Headers["p"]!="p")
            Response.Redirect("/",true);
        else
            view = GetActView();

        return view;
        }
它是通过单击附加函数的事件引起的:

       function updateDiv() { 
               xmlhttp = new XMLHttpRequest();   
           xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
              document.getElementById('actdiv').innerHTML = xmlhttp.responseText;
            } 
            }
           xmlhttp.open('GET', '/Act', true);
          xmlhttp.setRequestHeader("p", "p");
          xmlhttp.send();                
         }

但除了此功能的请求外,我还可以通过浏览器website.com/Act value的地址行收集到操作地址。这是我的网站不允许的行为。如何正确防止用户的此类行为?

您可以通过将请求更改为“POST”而不是“GET”来做到这一点。然后该操作应使用[HttpPost]属性修饰,如下所示:

[HttpPost]
public string Act()
{     
}

您可以在控制器操作中使用
Request.IsAjaxRequest
进行检查。对于您的操作,可以按以下方式进行:

public string Act()
{     
    if(Request.IsAjaxRequest)
    {
      //AJAX work or response
    }
   //Non-AJAX work

}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = filterContext.Result as ViewResultBase;
            if (result != null && result.Model != null)
            {
                filterContext.Result = new JsonResult
                {
                    Data = result.Model,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        }
    }
}
[AjaxOnly]
public string Act()
{     


}
您甚至可以为此编写自定义属性,如下所示:

public string Act()
{     
    if(Request.IsAjaxRequest)
    {
      //AJAX work or response
    }
   //Non-AJAX work

}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = filterContext.Result as ViewResultBase;
            if (result != null && result.Model != null)
            {
                filterContext.Result = new JsonResult
                {
                    Data = result.Model,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        }
    }
}
[AjaxOnly]
public string Act()
{     


}
这可以应用于控制器方法,就像其他FFilter一样,如下所示:

public string Act()
{     
    if(Request.IsAjaxRequest)
    {
      //AJAX work or response
    }
   //Non-AJAX work

}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
        {
            var result = filterContext.Result as ViewResultBase;
            if (result != null && result.Model != null)
            {
                filterContext.Result = new JsonResult
                {
                    Data = result.Model,
                    JsonRequestBehavior = JsonRequestBehavior.AllowGet
                };
            }
        }
    }
}
[AjaxOnly]
public string Act()
{     


}

你不能可靠地做到这一点。更好的选择是设计应用程序,以便通过地址栏访问操作是可以的。那么在这种情况下,如何处理SPA?@JohnStiks我们使用多种方法实现安全功能。一个是在我的回答中,第二个是使用
AntiForgeryToken
应该注意,这可能是伪造的,并且不应该依赖于安全性。