我们是否可以在没有opim-subscription密钥的情况下在azure中公开api管理端点?

时间:2016-12-15 05:40:03

标签: azure azure-api-management

我们是否可以使用作为标题的一部分发送的订阅密钥来公开API管理端点?

5 个答案:

答案 0 :(得分:7)

可以实现此目的,您可以通过与API相关联的产品来实现此目的。

在发布商门户中,转到产品菜单,然后选择与API相关联的产品(甚至仅为没有订阅密钥的用法设置新产品)。然后选择设置选项卡并取消选中要求订阅复选框,然后保存设置。

请注意,执行此操作后,您将丢失与不同用户相关的所有指标以及您希望以不同方式应用于不同消费者的任何其他功能。

答案 1 :(得分:4)

另一种选择是在URL中发送订阅密钥,如果您访问开发人员门户并下载API的Swagger文档,您将看到:

{ "name": "subscription-key", "in": "query", "description": "subscription key in url", "type": "string" }, { "name": "Ocp-Apim-Subscription-Key", "in": "header", "description": "subscription key in header", "type": "string" }

API管理还接受查询字符串中的订阅密钥。

答案 2 :(得分:1)

有一种非常简单的方法可以通过API管理界面来实现。

在“ API”页面上,选择您的API,然后单击“设置”标签。向下滚动到“订阅”部分,然后取消选中“需要订阅”选项。

您现在可以调用api,而无需在标头中或作为查询字符串的一部分提供订阅密钥。

API Management screenshot

答案 3 :(得分:0)

我尝试创建不需要订阅的新产品。我更新了我的一个API,使其仅与此新产品相关联。当我对其进行测试时,我收到一个400级错误(我认为是401),抱怨该请求没有订阅ID。

我联系了Azure支持部门,发现这是一个已知的错误。在此处复制/粘贴响应:

  

在调查问题时,您的APIM服务似乎已经   遇到一个已知的错误。由于存在此错误,因此将产品从   关闭(需要订阅)即可打开(不需要   订阅)并不总是能正常生效。但是,这可以   重启APIM服务所在的VM即可轻松解决。您   可以通过转到左侧导航栏中的VNET刀片来完成此操作   APIM下的菜单,然后按“应用网络配置”   顶部的按钮。这将重新启动Dev SKU VM,并应该使您进入   不需要订阅密钥的正确位置。

     

重新启动后,APIM应该关闭约5分钟,其中15分钟   分钟是重置VNET所需的最大时间。当。。。的时候   APIM重新启动,可能需要额外的少量时间才能完成   自行解决(也许5-10分钟),然后再走   希望的。

答案 4 :(得分:0)

Microsoft在azure APIM中为ocip-subscription-key添加了新范围,从而绕过了产品范围。我们可以在测试控制台中使用此键。

https://docs.microsoft.com/en-us/azure/api-management/api-management-subscriptions

现在的问题是我无法删除此密钥。如果我使用标头中的此键发送来自邮递员的请求,我的API将绕过在产品级别设置的Authorization标头,并调用我的API。

我已使用以下代码在我的API中限制了此标头

<check-header name="Authorization" failed-check-httpcode="401" failed-check-error-message="Not authorized" ignore-case="false" />
    <choose>     
        <when condition="@{                
            string[] value;                
            if (context.Request.Headers.TryGetValue("Ocp-Apim-Subscription-Key", out value))                
            {                    
                if(value != null && value.Length > 0)                    
                {                        
                    return true;                    
                }                
            }                
            return false;            
            }">        
            <return-response response-variable-name="response">          
                <set-status code="401" reason="Unauthorized" /> 
                <set-body>
                    {"statusCode": 401,"message": "Subscription key not allowed"}
                </set-body>        
            </return-response>      
        </when>    
    </choose>  

在这里1,我正在检查请求应包含授权标头。之后,如果请求包含ocip-subscription-key,我将发送错误。

还有什么更好的方法可以阻止我的请求发送全局ocip-subscription-key

谢谢