asp.net mvc jsonresult阻止外部使用

时间:2011-09-13 04:28:58

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

是否可以阻止json结果的任何其他使用并仅允许来自我的应用程序的请求? 当我们使用这样的东西时:

Json(q, JsonRequestBehavior.AllowGet)

它允许来自任何地方的所有请求。是否存在任何身份验证以检查请求来自何处?

3 个答案:

答案 0 :(得分:2)

我认为你的意思是:

如何只允许AJAX请求?

如果是这样,请查看以下博文。它描述了创建可重用的过滤器:

AjaxOnly attribute

代码看起来很简单,但我自己没有用过它:

public class AjaxOnlyAttribute : ActionFilterAttribute  
{  
    public override void OnActionExecuting(ActionExecutingContext filterContext)  
    {  
        if(!filterContext.HttpContext.Request.IsAjaxRequest())  
            filterContext.HttpContext.Response.Redirect("/error/404");  
    }  

    public override void OnActionExecuted(ActionExecutedContext filterContext)  
    {  

    }  
} 

然后您可以应用于控制器和操作:

[AjaxOnly]  
public ActionResult AjaxActionMethod()  
{  
    //....  
}

过滤器代码假定在某个控制器上存在可通过以下路径到达的操作:

/error/404

因此,我修改了代码,并生成了一种添加任意错误路径的简单方法(默认值为“/ error / 404”):

public class AjaxOnlyAttribute : ActionFilterAttribute
{
    public AjaxOnlyAttribute(){}

    public AjaxOnlyAttribute(string ErrorRoute)
    {
        this.ErrorRoute = ErrorRoute;
    }

    string errorRoute = "/Error/404"; // default route
    public string ErrorRoute 
    {
        get { return errorRoute; }
        set { errorRoute = value; }
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (!filterContext.HttpContext.Request.IsAjaxRequest())
            filterContext.HttpContext.Response.Redirect(this.ErrorRoute); //
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {

    }
}

现在可以按如下方式使用:

[AjaxOnly(ErrorRoute = "/MyArbitraryRoute/MyArbitraryParameter")
public ActionResult AjaxActionMethod()
{
   //....
}

答案 1 :(得分:1)

将[Authorize]属性添加到要保护的方法或控制器中。您可以指定组成员身份,并且需要登录。

答案 2 :(得分:0)

如果您只想让方法可以由您自己的应用程序调用,请将方法声明从public更改为internal。这会将方法的范围限制为应用程序内的调用。