Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何确保对返回JSON的MVC操作的访问_Asp.net Mvc_Ajax_Json_Asp.net Mvc 3_Odata - Fatal编程技术网

Asp.net mvc 如何确保对返回JSON的MVC操作的访问

Asp.net mvc 如何确保对返回JSON的MVC操作的访问,asp.net-mvc,ajax,json,asp.net-mvc-3,odata,Asp.net Mvc,Ajax,Json,Asp.net Mvc 3,Odata,我有一个面向公众的网站,是用ASP.NETMVC3开发的。MVC应用程序包含具有返回JSON的操作的控制器。网页根据返回JSON的操作执行AJAX请求 尽管使用JSON操作发布的数据不敏感,但它是专有的,我担心任何人都可以通过跨域调用或自定义应用程序调用返回JSON的操作。有没有办法只允许我的MVC应用程序网页访问返回JSON的操作?ODATA对解决这个问题有什么好处吗 有人知道有哪些资源将此问题描述为一种负担以及如何解决它吗?如果您的应用程序是公共的,那么它就更棘手了。有一个ValidateA

我有一个面向公众的网站,是用ASP.NETMVC3开发的。MVC应用程序包含具有返回JSON的操作的控制器。网页根据返回JSON的操作执行AJAX请求

尽管使用JSON操作发布的数据不敏感,但它是专有的,我担心任何人都可以通过跨域调用或自定义应用程序调用返回JSON的操作。有没有办法只允许我的MVC应用程序网页访问返回JSON的操作?ODATA对解决这个问题有什么好处吗


有人知道有哪些资源将此问题描述为一种负担以及如何解决它吗?

如果您的应用程序是公共的,那么它就更棘手了。有一个
ValidateAntiForgeryToken
属性,可以帮助防止XSS和随机请求

如果您有受密码保护的站点,请使用
Authorize
属性


OData与MVC站点存在相同的问题。

我有类似的设置,但在我的iOS设备中,必须与以JSON响应的页面进行通信。最后,我创建了一个
actionfilteratAttribute
,用于验证该设备1)是否通过其UDId添加到允许的设备列表中,2)分配给该设备的用户是否处于活动状态(当前使用)。问题是,这迫使我发布请求,这对我来说确实不是问题,但对你来说可能是,因为你可能允许GET请求。我也可能是错的,我认为模型绑定器仍然可以解析GET请求中的对象,并且过滤器可能仍然可以工作

无论如何,以下是我的过滤器的代码,如您所见:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
internal sealed class VerifyDeviceAttribute : ActionFilterAttribute {
    [Inject]
    public DeviceProvider DeviceProvider { private get; set; }

    public override void OnActionExecuting(
        ActionExecutingContext ActionExecutingContext) {
        string UDId = ActionExecutingContext.HttpContext.Request.Form["Authorization.UDId"];

        if (this.DeviceProvider.Exists(UDId) && !this.DeviceProvider.Get(UDId).User.Active) {
            ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("User", "The user is not active");
        } else if (!this.DeviceProvider.Exists(UDId)) {
            ActionExecutingContext.Controller.ViewData.ModelState.AddModelError("UDId", "The UDId is empty");
        };
    }
}

您可能会注意到,我正在将错误推入控制器
ModelState
,如果有,并且在操作结果中,我总是在格式化响应之前检查模型状态,因此请确保您总是检查
ModelState

如果您使用的是角色,您可以使用Authorize属性限制访问。

如果您真的想要获得安全,您可以像对待数据库一样对待返回JSON的控制器,并将其部署到防火墙后面的单独应用程序,而前端边缘服务器位于DMZ中


客户端可以连接到前端web服务器,前端web服务器反过来调用防火墙后面的JSON资源。客户端无法直接连接到JSON资源。

您可以使用ValidateAntiForgeryToken来防止人们对您的方法发出请求。但是,由于您使用的是数据客户端,因此,一旦数据发送到客户端,他们就有很多其他方法可以访问您的数据。您几乎无法(如果有的话)阻止以某种方式挖掘您允许公开访问的数据或信息