如何使用 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 管理 - 用户元数据

如何将请求中的值复制到 Azure API 管理策略中的响应中

如何在 Azure API 管理中的每个请求后关闭 SSL 连接

在 Azure API 管理器中验证 POST 请求正文

Azure API 管理:使用可为空的属性验证内容