【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验

简介: 【Azure API 管理】APIM CORS策略设置后,跨域请求成功和失败的Header对比实验

在文章“从微信小程序访问APIM出现200空响应的问题中发现CORS的属性[terminate-unmatched-request]功能”中分析了CORS返回空200的问题后,进一步对APIM的CORS策略进行验证,深入学习<CORS 跨域资源共享>。

首先,我们已经学习到CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,整个CORS通信过程,都是浏览器自动完成,不需要用户参与。而服务端则不同,它是实现CORS通信的关键。只要服务器实现了CORS接口,就可以跨源通信。本文中服务端就是Azure APIM (https://portal.azure.cn/#blade/HubsExtension/BrowseResource/resourceType/Microsoft.ApiManagement%2Fservice)。

 

在APIM中,是通过配置策略(Policy)来实现CORS设置的。在APIM门户中有多种级别可以开启CORS,可以根据API的使用情况灵活配置不同的跨域策略(cors policy)。

1) 产品级别(Products Policies):作用范围为产品下的全部API

2) All APIs 级别 (Inbound processing):作用范围为当前APIM中的所有API,所以在查看策略时,一定要注意是否有全局策略

3) All operstions 级别(Inbound processing):作用范围为当前一个API下面的所有操作,如GET, POST, PUT....

4) One Operation级别 (最原子级,只影响一个操作): 有效范围仅对当前配置的一个操作

以上四个级别一一对应下图中1,2,3,4标记位:

 

跨域请求成功 VS 失败

浏览器将CORS请求分成两类:简单请求(simple request)非简单请求(not-so-simple request), 如何区别这两者可参考:[HTTPS]跨域资源共享 CORS 详解 -[转自:阮一峰的网络日志 » 首页 » 档案 http://www.ruanyifeng.com/blog/2016/04/cors.html]

 

对比一:简单请求 GET

浏览器直接发出CORS请求。会在Requst头信息之中,增加一个Origin字段,值为浏览器中的URL。服务器根据这个值,决定是否同意这次请求。

  • 如果Origin指定的域名,不在许可范围内,服务器会返回一个正常的HTTP回应(200的空返回)。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段,就知道出错了,从而抛出一个CORS error错误。
  • 如果Origin指定的域名,在许可范围内,服务器返回的响应,会多出几个Access-Control-* 头信息字段。
CORS error 浏览器表现(打开开发者模式窗口可见 F12)
GET CORS 请求错误,不包含Access-Control-Allow-Origin字段
GET CORS 请求成功,包含Access-Control-Allow-Origin字段

 

 

对比二:非简单请求 OPTIONS, POST

非简单请求是那种对服务器有特殊要求的请求,比如请求方法是POST, PUTDELETE,或者Content-Type字段的类型是application/json。非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。"预检"请求用的请求方法是OPTIONS,表示这个请求是用来询问的。头信息里面,关键字段是Origin,表示请求来自哪个源。

  • 如果服务器否定了"预检"请求,会返回一个正常200的HTTP回应,但是没有任何CORS相关的头信息字段。这时,浏览器就会认定,服务器不同意预检请求,因此触发一个错误.
  • 如果服务器收到"预检"请求以后,检查了OriginAccess-Control-Request-MethodAccess-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应。关键的是Access-Control-Allow-Origin字段,表示可以请求数据。也可以为星号,表示同意任意跨源请求。
OPTIONS请求跨域失败
OPTIONS请求跨域成功
POST 请求跨域成功

(PS: 以上数据在测试中通过Fiddler抓包获取到OPTIONS和POST请求数据)

结论:

在遇见CORS报错后,查看请求的返回内容即可得出是否在服务端正确配置源站点

 

参考资料

API Management cross domain policies:https://docs.microsoft.com/en-us/azure/api-management/api-management-cross-domain-policies#CORS

跨域资源共享 CORS 详解:http://www.ruanyifeng.com/blog/2016/04/cors.html

 

相关文章
|
10月前
|
API 网络安全 网络架构
【Azure APIM】解答REST API实现"禁用自签名证书的证书链验证"中的backends参数值从那里取值的问题?
本文介绍APIM服务调用后端API时因自签名证书导致500错误的解决方案。通过REST API禁用证书链验证,关键在于获取正确的backendId(即APIM中配置的Backend名称),并调用PATCH接口设置validateCertificateChain为false,从而解决SSL/TLS信任问题。
319 7
|
XML 安全 API
【Azure APIM】API Management的Policy是否支持 SAML assertion?
本文探讨了API Management是否支持通过策略(如validate-jwt)验证SAML assertion的问题。结论是API Management目前不支持SAML assertion验证,因其为XML-based token,而validate-jwt仅适用于JWT tokens。文章进一步介绍了SAML(安全断言标记语言)的基本原理、Assertion的组成及用途,包括单点登录(SSO)、跨组织身份验证、云服务集成和安全性增强等方面,帮助读者深入了解SAML的工作机制及其应用场景。
210 25
|
11月前
|
API 网络架构 容器
【Azure Container App】查看当前 Container App Environment 中的 CPU 使用情况的API
在扩展 Azure Container Apps 副本时,因 Container App Environment 的 CPU 核心数已达上限(500 cores),导致扩展失败。本文介绍如何使用 `az rest` 命令调用 Azure China Cloud 管理 API,查询当前环境的 CPU 使用情况,并提供具体操作步骤及示例。
374 17
|
11月前
|
安全 API 数据安全/隐私保护
【Azure 环境】Microsoft Graph API实现对Entra ID中应用生成密码的时间天数
本文介绍如何通过 Azure 的 App Management Policy 限制用户在创建 AAD 应用程序的 Client Secret 时设置最长 90 天的有效期。通过 Microsoft Graph API 配置 defaultAppManagementPolicy,可有效控制密码凭据的生命周期,增强安全管理。
269 4
|
人工智能 前端开发 JavaScript
webpack-dev-server代理后端一直报CORS跨域或500错误
在Vue项目中使用Webpack的devServer代理后端接口时,遇到500错误。问题根源在于浏览器请求中携带的Origin头导致服务器报错,而Postman测试正常。通过分析发现,调整或移除Origin头可解决问题。解决办法包括:1) 在代理配置中添加正确的Origin头;2) 删除请求中的Origin头。文章还深入解析了Origin头的作用及changeOrigin配置的实际意义,并附带相关文档链接,帮助开发者更好地理解与解决类似跨域问题。
1034 20
|
10月前
|
安全 API PHP
PHP中实现CORS跨域资源共享的方法
通过这种方式,你可以在PHP应用中灵活地实现CORS,以支持跨域Web应用的需求。
678 15
|
前端开发 JavaScript 应用服务中间件
前端跨域问题解决Access to XMLHttpRequest at xxx from has been blocked by CORS policy
跨域问题是前端开发中常见且棘手的问题,但通过理解CORS的工作原理并应用合适的解决方案,如服务器设置CORS头、使用JSONP、代理服务器、Nginx配置和浏览器插件,可以有效地解决这些问题。选择合适的方法可以确保应用的安全性和稳定性,并提升用户体验。
9724 90
|
JSON 安全 前端开发
浅析CORS跨域漏洞与JSONP劫持
浅析CORS跨域漏洞与JSONP劫持
1240 3
|
JSON 缓存 前端开发
对CORS(跨域)的一些见解
CORS(跨域资源共享)是W3C标准,用于解决AJAX跨源请求限制。浏览器与服务器需共同支持CORS,浏览器自动处理请求头,开发者无需额外操作。CORS分为简单请求与非简单请求:简单请求满足特定条件(如方法为GET/POST/HEAD且头信息有限制),浏览器直接发送;非简单请求需先进行“预检”请求(OPTIONS方法),确认服务器允许后才发送实际请求。服务器回应需包含Access-Control-Allow-Origin等字段,以控制跨域访问权限。
443 10
|
开发框架 中间件 Java
如何处理跨域资源共享(CORS)的 OPTIONS 请求?
处理 CORS 的 OPTIONS 请求的关键是正确设置响应头,以告知浏览器是否允许跨域请求以及允许的具体条件。根据所使用的服务器端技术和框架,可以选择相应的方法来实现对 OPTIONS 请求的处理,从而确保跨域资源共享的正常进行。
999 61