如何使用 Azure API 管理为 API 中的每个方法设置 405 Method Not Allowed
Posted
技术标签:
【中文标题】如何使用 Azure API 管理为 API 中的每个方法设置 405 Method Not Allowed【英文标题】:How to setup 405 Method Not Allowed for each of the methods in APIs using azure API Management 【发布时间】:2020-11-18 01:00:00 【问题描述】:在 Azure API 管理中如何设置 405(不允许方法)策略。我正在使用 azure API 管理 API 并添加不同的策略,例如 jwt 验证、IP 过滤、速率限制等等。但我找不到添加 APIM 中不允许的 405 方法的方法。我想为每种方法设置它。这意味着我想阻止来自 APIM 的传入无法识别的方法请求。 (例如:Get 而不是 POST(APIM 不允许抛出 405 方法)。目前 APIM 将错误的方法传递给后端,并从应用程序返回 404。任何人都知道我们如何阻止来自 APIM 端的错误请求并返回 405将其传递给后端并返回 404?。
【问题讨论】:
【参考方案1】:您可以在每个方法的入站策略上使用Control Flow 策略和Context Variable 来拦截与定义的http 方法不匹配的任何请求,然后使用Set Status 策略返回405。因此,对于 GET 方法,大致如下:
<policies>
<inbound>
<choose>
<when condition="@(context.Request.Method.ToString() != "GET")">
<return-response>
<set-status code="405" reason="No Content" />
</return-response>
</when>
</choose>
<base />
</inbound>
... rest of policies
</policies>
如果您有多个具有相同路径的方法,您可能需要在 API 级别而不是方法级别应用它,并使条件等于未使用的方法而不是 不等于使用的方法
要在 API 级别设置它并检查一组未使用的方法,请创建以下策略:
<policies>
<inbound>
<choose>
<when condition="@
ICollection<string> disallowedMethods = new List<string>() "POST", "PUT" ;
return disallowedMethods.Contains(context.Request.Method.ToString());
">
<return-response>
<set-status code="405" reason="No Content" />
</return-response>
</when>
</choose>
<base />
</inbound>
... rest of policies
</policies>
此示例中未使用的 http 方法是 POST 和 PUT,但您可以将列表更改为适用于您的用例的任何内容。
【讨论】:
嗨尼克,非常感谢您的快速回答。我试图实现这一点,但我正在考虑在 API 级别实现这一点,因为我在一个 API 中有很多方法,并且为每个方法添加非常复杂,对于 Azure APIM,你知道如何创建检查将API中方法列表中的现有方法与请求方法进行比较,URL和方法是否正确? @YadukrishnanP 我认为这是不可能的。我添加了一个示例,说明如何使用静态 http 方法列表来执行此操作,但要动态检查您需要进行 API 调用才能获取它们的现有方法。看起来没有可用的 .NET Framework 方法可以让您这样做 - docs.microsoft.com/en-us/azure/api-management/…以上是关于如何使用 Azure API 管理为 API 中的每个方法设置 405 Method Not Allowed的主要内容,如果未能解决你的问题,请参考以下文章
Azure API 管理 - 如何刷新访问令牌后端 API?
如何将请求中的值复制到 Azure API 管理策略中的响应中