【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

这篇具有很好参考价值的文章主要介绍了【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

使用Azure API Management, 想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问?

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

 文章来源地址https://www.toymoban.com/news/detail-424006.html

ChatGPT 解答

最近ChatGPT爆火,所以也把这个问题让ChatGPT来解答,然后人工验证它的回答正确与否?

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

根据对APIM Policy的文档参考, choose 和 rate-limit 策略组合理论上的确可以实现要求, 接下来就让我们实际验证:

  • choose策略:https://docs.azure.cn/zh-cn/api-management/api-management-advanced-policies#choose ,choose 策略根据布尔表达式的求值结果应用括住的策略语句,类似于编程语言中的 if-then-else 或开关构造。
  • rate-limit策略:https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRate , rate-limit 策略可以对调用速率进行限制,使每个指定时段的调用不超出指定的数目,避免单个订阅的 API 使用量暴增。 超过调用速率时,调用方会收到 429 Too Many Requests 响应状态代码。

 

验证步骤

1)在API的Inbound 策略中添加 choose策略

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

(策略具体内容,见文末)

2) 测试验证,连续对该API访问10次以上,得到429 Too Many Requests错误

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

3)以上证明,ChatGPT针对这个问题的解答是正确的!

 

工程师解答

在参考ChatGPT给出的 choose + rate limit 组合后,我们也发现另一个选项。使用 rate-limit-by-key 策略实现对特定IP的速率限制。

  • rate-limit-by-key 策略:https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRateByKey , 可以对调用速率进行限制,使指定时段的调用不超出指定的数目,避免单个密钥的 API 使用量暴增。 密钥的值可以是任意字符串,通常使用策略表达式来提供密钥。 可以添加可选增量条件,指定在决定是否到达限制值时应该进行计数的请求。 超过此调用速率时,调用方会收到 429 Too Many Requests 响应状态代码。

在官方文档中给出的示例中,是针对所有的IP(context.Request.IpAddress)都进行了10次/60秒请求的限制,而本示例中则特指“某些固定IP”限制。那么如何来完成这个需求呢?

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

答案 就在“rate-limit-by-key 策略”的说明中,”可以添加可选增量条件,指定在决定是否到达限制值时应该进行计数的请求”, 所以,只要可选增量条件(increment-condition) 的值根据输入的IP地址动态赋值True/False, 就能完美匹配以上要求。

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

 

理论推断,只需要实现如下逻辑,即可以实现终极需求“想对一些固定的IP地址进行访问次数的限制,如被限制的IP地址一分钟可以访问10次,而不被限制的IP地址则可以无限访问?

只需两步:

1)通过设置一个变量(set-variable) 值,用C#代码来计算变量值,在赋值语句中,预先定义一个IP限制列表,通过 contains 检查当前请求IP是否在列表中,返回True or False 。True表示当前请求的IP需要速率限制, 否则,不需要。

2) 然后,在rate-limit-by-key 的 increment-condition条件中使用上一步参数值,进行判断是否计入限制

验证步骤

1)在API的 Inbound 策略中添加 rate-limit-by-key策略

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

(策略具体内容,见文末)

 

2)验证在30秒,访问5次以上后,同样得到429 Too Many Requests错误

 【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

3) 当在请求Headers中添加Ocp-Apim-Trace: true 和 Ocp-Apim-Subscription-Key: {订阅Key}后,可以查看请求在APIM中执行的日志跟踪。可以查看rate-limit-by-key 策略的执行情况.

【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求

 

总结

想实现固定IP地址访问次数的限制,至少有如下两种解决方案。

方案一:Choose + rate-limit 策略组合

<!--
    IMPORTANT:
    - Policy elements can appear only within the <inbound>, <outbound>, <backend> section elements.
    - To apply a policy to the incoming request (before it is forwarded to the backend service), place a corresponding policy element within the <inbound> section element.
    - To apply a policy to the outgoing response (before it is sent back to the caller), place a corresponding policy element within the <outbound> section element.
    - To add a policy, place the cursor at the desired insertion point and select a policy from the sidebar.
    - To remove a policy, delete the corresponding policy statement from the policy document.
    - Position the <base> element within a section element to inherit all policies from the corresponding section element in the enclosing scope.
    - Remove the <base> element to prevent inheriting policies from the corresponding section element in the enclosing scope.
    - Policies are applied in the order of their appearance, from the top down.
    - Comments within policy elements are not supported and may disappear. Place your comments between policy elements or at a higher level scope.
-->
<policies>
    <inbound>
        <base />
        <set-variable name="IsCountIpLimit" value="@{
                string ipAddress =context.Request.IpAddress; 

                List<string> cidrList = new List<string>(){
                    "167.xxx. xxx.135",
                    "167.xxx. xxx.136",
                    "167.xxx. xxx.137"
                };
                return cidrList.Contains(ipAddress);
                }" />
        <choose>
            <when condition="@((bool)context.Variables["IsCountIpLimit"])">
                <rate-limit calls="10" renewal-period="60" />
            </when>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

 

方案二:rate-limit-by-key策略

<!--
    IMPORTANT:
    - Policy elements can appear only within the <inbound>, <outbound>, <backend> section elements.
    - To apply a policy to the incoming request (before it is forwarded to the backend service), place a corresponding policy element within the <inbound> section element.
    - To apply a policy to the outgoing response (before it is sent back to the caller), place a corresponding policy element within the <outbound> section element.
    - To add a policy, place the cursor at the desired insertion point and select a policy from the sidebar.
    - To remove a policy, delete the corresponding policy statement from the policy document.
    - Position the <base> element within a section element to inherit all policies from the corresponding section element in the enclosing scope.
    - Remove the <base> element to prevent inheriting policies from the corresponding section element in the enclosing scope.
    - Policies are applied in the order of their appearance, from the top down.
    - Comments within policy elements are not supported and may disappear. Place your comments between policy elements or at a higher level scope.
-->
<policies>
    <inbound>
        <base />
        <set-variable name="IsCountIpLimit" value="@{
                string ipAddress =context.Request.IpAddress; 

                List<string> limitIPs = new List<string>(){
                    "167.xxx. xxx.135",
                    "167.xxx. xxx.136",
                    "167.xxx. xxx.137"
                };

                return limitIPs.Contains(ipAddress);
                }" />
        <rate-limit-by-key calls="5" renewal-period="30" counter-key="@(context.Request.IpAddress)" increment-condition="@(context.Response.StatusCode >= 200 && context.Response.StatusCode < 300 && (bool)context.Variables["IsCountIpLimit"])" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

 

 

参考资料

choose策略:https://docs.azure.cn/zh-cn/api-management/api-management-advanced-policies#choose 

rate-limit策略:https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRate ,

rate-limit-by-key 策略:https://docs.azure.cn/zh-cn/api-management/api-management-access-restriction-policies#LimitCallRateByKey 

 

到了这里,关于【Azure API 管理】APIM如何实现对部分固定IP进行访问次数限制呢?如60秒10次请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Azure Data Factory REST API和HDInsight Spark进行简化数据处理

    在这篇文章中,我们将探讨如何利用Azure Data Factory和HDInsight Spark创建一个强大的数据处理管道。 在当今数据驱动的世界中,组织经常面临着高效可靠地处理和分析大量数据的挑战。Azure Data Factory是一种基于云的数据集成服务,结合HDInsight Spark,一种快速可扩展的大数据处理框

    2024年02月10日
    浏览(87)
  • Azure API 管理缺陷突出了 API 开发中的服务器端请求伪造风险

      微软最近修补了其 Azure API 管理服务中的三个漏洞,其中两个漏洞启用了服务器端请求伪造 (SSRF) 攻击,这些攻击可能允许黑客访问内部 Azure 资产。 概念验证漏洞用于突出开发人员在尝试为自己的 API 和服务实施基于黑名单的限制时可能犯的常见错误。 Web API 已成为现代应

    2024年02月13日
    浏览(41)
  • Linux如何设置固定IP

    首先,Linux的默认网关和DNS解析都是一个地址。 IPV4 IP地址是32位2进制 前缀默认是24但是格式还是得写 DNS解析域名,类似Map,根据域名寻找IP DHCP 如果是自动设置IP,就是由他来自行分配,但是手动的话,就需要干掉他 1.设置固定IP 1.先看一下我们的网关 点击虚拟网络编辑器

    2024年02月09日
    浏览(32)
  • 如何设置本地连接ip 本机固定IP地址设置方法

    本地IP怎么设置?很多配置路由器的时候有时候找不到192.168.1.1就是因为本地固定ip地址有问题,这个时候就需要我们设置本地固定ip地址了,近日又有不少网友向编辑问这个问题,今天yii666编辑专门针对本地连接ip设置做详细介绍,方便大家查找。 其实需要设置本地IP一般是在

    2024年02月05日
    浏览(30)
  • 虚拟机(VMware )如何固定系统IP

    虚拟机固定系统IP,方便远程连接 在虚拟机关机的时候去配置地址 1,打开编辑下的虚拟网络编辑器 2,高版本的虚拟机自动固定IP,如果需要修改,可以点击“更改设置” 3,点击VMnet8,修改子网IP和子网掩码为自己需要的,子网掩码一定要是“255.255.255.0”然后点击NAT设置

    2024年02月05日
    浏览(29)
  • 【虚拟机搭建-VMware设置固定IP】VMWare中CentOS如何设置固定IP【不成功手把手教学】

    在日常工作学习中(比如博主在之前学习k8s过程中,windows本地搭建虚拟机,重启windows后) 虚拟机的IP会发生变化,所以该篇文章详细记录VMWare中CentOS如何设置固定IP 参考: https://rundreams.blog.csdn.net/article/details/129229318 3.1、虚拟网卡配置 在 VMWare 安装成功后,砸在网络连接处会

    2024年02月11日
    浏览(39)
  • 【Hyper-v 管理器虚拟机配置内网外网固定ip】

    Hyper-V自带一个不能删除的Default Switch虚拟交换机,虚拟机使用该网络可以自动获取IP直接上网。但这个网络的网关地址每次重启后都会改变,所以你无法在虚拟机上设置固定IP用于宿主机SSH访问。 微软官方说明:每次主机重启后Hyper-V会自动找一个未使用的网络然后修改Defaul

    2024年02月10日
    浏览(49)
  • 设置数据库服务器电脑固定IP,指定IP,静态IP的方法教程,WIn7电脑如何设置固定IP的方法,设置电脑的指定IP

    设置数据库服务器电脑固定IP,指定IP,静态IP的方法教程,WIn7电脑如何设置固定IP的方法,设置电脑的指定IP_哔哩哔哩_bilibili 本期视频讲解:如何将服务器电脑的IP地址改成固定IP。 https://www.bilibili.com/video/BV1qF411F7wF/ 盘点机PDA登录界面,【连接设置】里,如果是局域网实时在

    2024年02月10日
    浏览(40)
  • Ubuntu 22.04系统如何设置固定IP地址。

    在Ubuntu 22.04上设置固定IP地址,您可以按照以下步骤进行操作: 打开终端,以管理员权限编辑网络配置文件: 在文件中,您会看到类似以下内容的配置: 将  dhcp4: true  修改为  dhcp4: no ,以禁用DHCP并启用手动配置。 添加静态IP地址配置,例如: 将  enp0s3  替换为您的网络接

    2024年02月17日
    浏览(39)
  • 如何固定 wsl-ubuntu 的 IP 地址

    打开 /etc/netplan/ 目录,这个目录在 Ubuntu 中存放网络配置。 备份默认的网络配置文件, 编辑网络配置文件, 在文件中添加以下内容,其中静态 IP、子网掩码请根据你的实际网络情况填写, 保存并退出网络配置文件。 应用新的网络配置, 这样就可以将 WSL Ubuntu 的 IP 固定成静态

    2024年02月02日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包