如何在 Azure API 管理中绕过 API 中单个端点的订阅密钥

问题描述 投票:0回答:2

我想避免为 API 中的单个端点提供订阅密钥。到目前为止,我发现我可以禁用整个产品或 API 的订阅,这不是我想要的。这可能吗?

我想到的唯一方法是另一个 API 和产品,在这个单一端点中公开(显然没有订阅)。

azure azure-api-management
2个回答
2
投票

从评论中总结,目前我们无法实现您在APIM中对某个api端点禁用“订阅”的要求。

解决方法是您提到的为端点创建另一个 api 或产品并禁用“订阅”。

另一种解决方法是在 api 中禁用所有端点的“订阅”,并为端点(除了唯一的一个端点)添加一个查询参数(或标头参数)作为“订阅密钥”。然后检查大多数端点的“入站”策略中的订阅密钥。

对于此功能,您还可以在 azure feedback 页面上创建一个票证以建议 azure 开发团队添加它。


0
投票

这是我们遵循的方法,它对我们有用。

  1. 在 API 级别将需要订阅设置为 false,这告诉 APIM 不要拒绝没有订阅密钥的 API

  2. 通过创建操作级别策略来检查特定 API 端点的订阅值。在您的策略中,您需要检查 context.Subscription 变量,以确定请求是否链接到订阅(https://learn.microsoft.com/en-us/azure/api-management/api-management-policy -表达式#ContextVariables)。 APIM 本身会在调用您的策略之前对订阅值进行所有解析。如果有效的订阅值已随 API 请求一起传递,则其详细信息将在 context.Subscription 变量中设置并可用。在策略中,可以检查变量的值。如果设置了,则表示客户端通过了有效的订阅,否则订阅无效或未通过。操作级策略可以有这个条件:

    <inbound>
    <base />
    <set-variable name="subscriptionIdValue" value="@(context.Subscription is null ? "blank" : context.Subscription.Id)" />
    <choose>
        <when condition="@( context.Variables.GetValueOrDefault<string>("subscriptionIdValue") == "blank" )">
        <return-response>
            <set-status code="401" reason="Unauthorized" />
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>{ "statusCode": 401, "message": "Access denied due to invalid subscription key. Make sure to provide a valid key for an active subscription." }</set-body>
        </return-response>
        </when>
    </choose>
    
© www.soinside.com 2019 - 2024. All rights reserved.