我有一个面向公众的网站,它是用ASP.NET MVC 3开发的.MVC应用程序包含带有返回JSON的操作的控制器。 Web页面针对返回JSON的操作执行AJAX请求。
即使使用JSON操作发布的数据不敏感,它也是专有的,我担心任何人都可以通过跨域调用或自定义应用程序调用返回JSON的操作。有没有办法只允许我的MVC应用程序网页访问返回JSON的操作? ODATA是否为解决这个问题提供了任何好处?
是否有人知道将此问题描述为责任的资源以及如何解决该问题?
答案 0 :(得分:6)
如果您的申请是公开的,那么它就更棘手了。有ValidateAntiForgeryToken
属性可以帮助抵御XSS和随机请求。
如果您有受密码保护的网站,请使用Authorize
属性。
OData与MVC网站有相同的问题。
答案 1 :(得分:1)
如果您使用的是角色,则可以使用“授权”属性限制访问。
答案 2 :(得分:0)
我有类似的设置,但在我的iOS设备中必须与以JSON响应的页面进行通信。我最终创建了一个ActionFilterAttribute
,用于验证设备是否已由其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
!
答案 3 :(得分:0)
如果你真的想要获得安全,你可以像处理数据库那样处理返回JSON的控制器,并将它们部署到位于防火墙后面的独立应用程序,而前端边缘服务器则位于DMZ。
客户端可以连接到前端Web服务器,后者又调用防火墙后面的JSON资源。客户端无法直接连接到JSON资源。
答案 4 :(得分:0)
您可以使用ValidateAntiForgeryToken来阻止人们向您的方法发出请求,但是由于您正在使用数据客户端,因此在将数据发送到客户端后,他们还有许多其他方式来访问您的数据。您可以采取的措施很少(如果有的话),以防止您以某种方式开采可以公开访问的数据或信息