我正在构建一个mvc应用程序,我正在创建一个api控制器来允许来自我的一些前端页面的ajax请求。我想限制api控制器操作只允许来自我的服务器的请求(所以人们不能从他们自己的站点调用我的api。)
经过一番搜索后,我找到了许多提出自定义授权属性的解决方案,我做了:
public class LocalRequestOnlyAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase context)
{
return context.Request.IsLocal;
}
}
然后使用[LocalRequestOnly]
它在localhost上工作正常,但在我的aws服务器上,它不起作用,ajax请求作为错误返回
编辑 - 详情:
我正在使用具有相对路径的主机名。所以我的ajax电话的网址是" / api / getdata"。
我没有设置任何ajax请求标头。
我得到的错误是No 'Access-Control-Allow-Origin' header is present on the requested resource.
答案 0 :(得分:1)
我不知道如何解决问题,但您的解决方案无效,因为IsLocal没有按照您的预期行事。以下是其文档:https://msdn.microsoft.com/en-us/library/system.web.httprequest.islocal(v=vs.110).aspx
IsLocal检查客户端和服务器是否在同一台计算机上。因此,如果您在亚马逊服务器上浏览chrome,这将有效。您要做的是阻止跨源请求。
答案 1 :(得分:0)
为了限制api控制器操作仅允许来自服务器的请求,您应该什么都不做。我相信Ajax请求中引发的错误与浏览器拒绝跨源HTTP请求(来自其他服务器的请求)有关。所以你要做的就是在发生跨源HTTP请求时添加一个错误处理程序(一个try块)来存在Ajax逻辑。 阅读:https://jdiazo.wordpress.com/2012/01/12/getting-rid-of-vb6-compatibility-references/
答案 2 :(得分:0)
你不需要做任何事情。默认情况下,Web API仅允许来自同一域的请求,不支持CORS。
答案 3 :(得分:0)
请求的资源上没有'Access-Control-Allow-Origin'标头
表示 1.您的服务器拒绝跨源HTTP请求。你正在寻找这种行为,对吧? 2.您的服务器转向CORS以允许从其他域访问资源(您的API控制器),但没有找到必要的Access-Control-Allow-Origin响应标头,该标头指示响应是否可以与资源共享(脚本)具有给定来源的其他域名。
在我看来,这个“错误”不是错误代码的结果。同样,您应该在对服务器进行Ajax调用时定义一个处理此类失败的方法,并且它(此方法)应该正常退出。
答案 4 :(得分:0)
你无法阻止它,因为Http是无状态的,只能检查请求是ajax还是来自你的服务器或站点 - 使用Http头,但这些头不值得信任,因为它们可以通过服务器端编码手动设置。
但是,通过禁用CORS并检查这些Http标头(例如Referer(包含发出ajax请求的网页的地址),User-Agent和X-Requested-With(对于ajax请求设置为XMLHttpRequest),可能会变得困难)。