如何保护返回JSON的MVC操作的访问权限

3
我有一个公共的网站,使用ASP.NET MVC 3开发。MVC应用程序包含控制器,其动作返回JSON。 Web页面针对返回JSON的动作执行AJAX请求。
尽管发布的数据不敏感,但它是专有的,我担心任何人都可以通过跨域调用或自定义应用程序调用返回JSON的操作。有没有办法只允许我的MVC应用程序网页访问返回JSON的操作?ODATA是否提供解决此问题的任何好处?
有没有人知道描述这个问题作为责任以及如何解决它的资源?
5个回答

6
如果您的应用程序是公共的,那么情况会更加棘手。有一个名为ValidateAntiForgeryToken的属性可以帮助防止XSS和随机请求。
如果您有一个需要密码保护的网站,请使用Authorize属性。
OData与MVC站点具有相同的问题。

1
如果您正在使用角色,可以使用Authorize属性限制访问。

0

我有一个类似的设置,但在我的iOS设备中必须与响应JSON的页面通信。最终我创建了一个ActionFilterAttribute,它验证设备是否1)通过其UDId添加到允许设备列表中,并且2)分配给设备的用户处于活动状态(目前在职)。问题是这迫使我使用POST请求,对我来说这真的不是问题,但对你来说可能是因为你可能允许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

0

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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接