2016-12-14 127 views
0

我正在构建一个mvc应用程序,我正在制作一个api控制器以允许来自我的一些前端页面的ajax请求。我想限制api控制器操作只允许来自我的服务器的请求(所以人们不能从他们自己的站点调用我的api)。mvc web api只允许来自同一服务器的请求

经过一番周围搜索,我发现了许多解决方案提出了一个自定义的授权属性,这是我做:

public class LocalRequestOnlyAttribute : AuthorizeAttribute 
    { 
    protected override bool AuthorizeCore(HttpContextBase context) 
      { 
       return context.Request.IsLocal; 
      } 
} 

,然后用[LocalRequestOnly]

它正常工作在本地主机上把它扔到了我的控制器动作,但我的AWS服务器上,这是行不通的,Ajax请求回来为错误

编辑 - 详细:

我正在使用具有相对路径的主机名。所以我的ajax调用的网址是“/ api/getdata”。 我没有设置任何ajax请求标头。 我回来的错误是No 'Access-Control-Allow-Origin' header is present on the requested resource.

+0

你有更多的信息吗?你使用IP或主机名连接? AJAX请求标头是什么样的?返回的错误是什么? – murtuza

+0

细节增加 – blubberbo

回答

0

为了将api控制器操作限制为仅允许来自服务器的请求,您应该什么都不做。我相信Ajax请求中引发的错误是与浏览器拒绝跨源HTTP请求(来自其他服务器的请求)相关的错误。所以你所要做的就是添加一个错误处理程序(一个try块),以便在创建一个跨源HTTP请求时存在Ajax逻辑。 阅读此:https://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

+0

所以如果我什么都不做,那么来自其他服务器的HTTP请求将被阻止?但我可以通过邮递员向我的服务器发送邮件,并返回数据。如果它只允许从我的网络服务器,它应该拒绝邮递员的请求,不是? – blubberbo

+0

以前从未使用posmtan。但是,如果posmtan和您的Web应用程序位于同一台计算机上,则它是相同的域。 – Issac

+0

他们不是... – blubberbo

0

你不需要做任何事情。默认情况下,Web API只允许来自同一个域的请求,CORS不受支持。

+0

Hiw来邮递员的作品呢? – blubberbo

+0

@blubberbo,我不知道邮差,从来没有使用过它。你能简单地用jQuery创建一个简单的html页面,试着用jQuery.ajax来调用你的web页面中的api。我相信你不能访问该API。 –

0

否“访问控制允许来源”标题存在于所请求的资源

表示 1.你的服务器拒绝跨来源HTTP请求。这是你寻找的行为,对吧? 2.您的服务器要求CORS允许从不同域访问资源(您的API控制器),但没有找到必要的Access-Control-Allow-Origin响应标头,该标头指示是否可以与资源共享响应在其他域名上的脚本)与给定的来源。

这个“错误”,在我看来,不是错误代码的结果。同样,你应该定义一个方法来处理这种失败,当你对服务器进行Ajax调用时,它(这个方法)应该正常退出。

0

你不能阻止它,因为Http是无状态的,只有检查该请求是来自服务器或站点的请求的方法 - 使用Http标头,但这些标头不可信,因为它们可以通过服务器端编码进行手动设置。

但是,通过禁用CORS并检查这些Http头像Referer(包含从哪里发出Ajax请求的网页的地址),User-Agent和X-Requested-With(设置为XMLHttpRequest for ajax要求)。

相关问题