我已经在MVC中编程了几个月,最近我被要求重新审视我们的授权机制。
有一个属性可以检查用户可以访问操作结果的天气,但此属性不会出现在所有公共操作之上。有很多JsonResults和其他ActionResult操作可以从URL栏访问。
我的问题是天气值得将该属性添加到所有操作结果中 或者制作某种不允许访问该操作的属性,除非它是ajax请求或帖子?
答案 0 :(得分:0)
浏览器请求和ajax请求之间没有功能差异,它们都来自同一个http管道。事实很重要,有时在表单身份验证方案之外执行,因此添加[Authorize]
属性也可以阻止有效请求。
我会创建某种授权,需要使用某种类型的标头值来区分对Json方法的访问。
您可以将标头添加到已传递的每个ajax请求中,但这在Fiddler或Firebug等程序中很容易看到。您可以使用不断变化的授权密钥,但我认为开销的头痛成本会高于您可能尝试保护的数据。
您可以使用[AcceptVerbs(HttpVerbs.Post)]
来装饰您的方法,但同样可以使用Fiddler或Postman(chrome add-on)等程序轻松修复这些方法
答案 1 :(得分:0)
您可以使用Request.IsAjaxRequest
来确保请求来自AJAX请求。这将验证请求中是否存在X-Requested-With
标头,该标头在通过地址栏发出的请求中不存在。
你想要防范的威胁是什么?检查上述内容可以阻止临时用户阅读JsonResult
,但最终无法保护公众ActionResult
或JsonResult
,因为如果有人想要捕获您的回复,他们可以简单地制作他们的使用curl自己的请求:
curl --header "X-Requested-With: XmlHttpRequest" www.example.com/controller/method