问题描述
在Azure App Service中,当需要限制某些特殊的情况对其进行访问时候,可以通过IP限制,逻辑代码判断,或者Rewrite规则。通过IP限制则需要知道客户端访问的IP,而通过逻辑代码则需要对应用代码进行修改导致在部署才改动则会导致成本大增,所以可以有效的使用Rewrite规则来完成需求,比如当需要访问目标站点B时候请求中必须携带password及正确的值才可以访问(password=123456)。
IP限制
使用访问限制可以定义一个按优先级排序的允许/拒绝列表,用于控制在网络中对应用的访问。 该列表可以包含 IP 地址或 Azure 虚拟网络子网。 如果存在一个或多个条目,则在列表末尾会存在一个隐式的“拒绝所有”。
访问限制功能适用于所有应用服务托管工作负载,包括 Web 应用、API 应用、Linux 应用、Linux 容器应用和 Functions。
向应用发出请求时,将会根据访问限制列表中的 IP 地址规则评估 FROM IP 地址。 如果列表中的规则不允许访问该地址,则服务会以“HTTP 403”状态代码进行答复。
如何配置Rewrite规则
通过 web.config 文件配置 rewrite 规则,并将该配置上传到 Kudu站点site/wwwroot/ 目录下。例如:如下的Web 应用 只允许 url 包含 password=123456 才能访问配置。在 rewrite 下添加如下的配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="role1" patternSyntax="ECMAScript" stopProcessing="true">
<match url=".*" negate="false" />
<action type="CustomResponse" statusCode="403" statusReason="TypeInReasonHere" statusDescription="TypeInDescriptionHere" />
<conditions>
<add input="{QUERY_STRING}" pattern="^.*password=123456.*$" negate="true" />
</conditions>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
PS:以上匹配规则是对所有的请求URL的参数中是否包含password=123456,如不包含,则返回403. 测试效果如下:
![]() | |
参考资料
Azure 应用服务访问限制: https://docs.azure.cn/zh-cn/app-service/app-service-ip-restrictions#adding-and-editing-access-restriction-rules-in-the-portal
如何使用重写规则限制 Azure Web 应用的网站访问: https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/aog-app-service-web-qa-config-permission-only-allow-specified-site-to-access
URL Rewrite Module Configuration Reference: https://docs.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!