Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果没有opim订阅密钥,我们可以在azure中公开api管理端点吗?_Azure_Azure Api Management - Fatal编程技术网

如果没有opim订阅密钥,我们可以在azure中公开api管理端点吗?

如果没有opim订阅密钥,我们可以在azure中公开api管理端点吗?,azure,azure-api-management,Azure,Azure Api Management,我们是否可以公开API管理端点,而不将订阅密钥作为标头的一部分发送?可以实现这一点,您可以通过与API关联的产品来实现 在Publisher Portal中,转到“产品”菜单,选择与API关联的产品(甚至设置一个新产品,仅用于不带订阅密钥的用途)。然后选择“设置”选项卡,取消选中“需要订阅”复选框,然后保存设置 @sdementen更新了以下评论 请注意,这样做,您将失去与不同用户相关的所有指标,以及您可能希望对不同消费者应用的任何其他功能。另一个选项是在URL中发送订阅密钥,如果您转到开发人员

我们是否可以公开API管理端点,而不将订阅密钥作为标头的一部分发送?

可以实现这一点,您可以通过与API关联的产品来实现

在Publisher Portal中,转到“产品”菜单,选择与API关联的产品(甚至设置一个新产品,仅用于不带订阅密钥的用途)。然后选择“设置”选项卡,取消选中“需要订阅”复选框,然后保存设置

@sdementen更新了以下评论
请注意,这样做,您将失去与不同用户相关的所有指标,以及您可能希望对不同消费者应用的任何其他功能。

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

{
“名称”:“订阅密钥”,
“在”:“查询”,
“说明”:“url中的订阅密钥”,
“类型”:“字符串”
},
{
“名称”:“Ocp Apim订阅密钥”,
“in”:“header”,
“说明”:“标头中的订阅密钥”,
“类型”:“字符串”
}


API管理还接受querystring中的订阅密钥。

我尝试创建一个不需要订阅的新产品。我更新了我的一个API,使它只与这个新产品关联。当我测试它时,我得到了一个400级的错误(我想是401),它抱怨请求没有订阅id

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

在调查您的问题时,您的APIM服务似乎 遇到已知错误。由于此缺陷,将产品从 关闭(需要订阅)打开(不需要订阅) 订阅)并不总是正确生效。然而,这可以 通过重新启动承载APIM服务的VM,可以轻松修复此问题。你 可以通过转到左侧导航上的VNET刀片服务器来执行此操作 APIM下的菜单并按“应用网络配置” 按钮在顶部。这将重新启动Dev SKU虚拟机,并将您放入 不需要订阅密钥的正确位置

重新启动后,APIM应停机约5分钟,停机时间为15分钟 分钟是重置VNET所需的最大时间。当 APIM恢复时,可能需要额外的少量时间 自己定下来(可能5-10分钟),然后就可以开始了 想要的


Microsoft在azure APIM中为ocip订阅密钥添加了一个新的作用域,该作用域绕过了产品作用域。我们可以在测试控制台中使用这个键

现在的问题是,我无法删除此密钥。如果我在邮件头中使用此密钥从邮递员发送请求,我的API将绕过在产品级别设置的授权邮件头并调用我的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>  

{“statusCode”:401,“消息”:“不允许订阅密钥”}
这里我首先检查请求是否应该包含授权头。之后,若请求包含ocip订阅密钥,我将发送错误

有没有更好的方法阻止我的请求发送全局ocip订阅密钥


谢谢

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

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

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


您希望API管理,但让API完全开放给所有人,还是您的意图是什么?这对我来说不太合适。我使用API管理中的一个模拟操作创建了API,创建了不需要订阅的产品,并将API添加到该产品中。现在,当我在没有Ocp Apim Subscription Key头的情况下调用这个操作时,我得到了HTTP 500内部服务错误,如果我只添加这个头,它就会工作。如果我转到产品设置并再次选中“需要订阅”复选框,我会得到HTTP 401“拒绝访问…”。最后一句可能有点误导。如果您使用的是开放式产品(即没有API密钥的产品),但需要其他方式进行身份验证(基本身份验证、JWT等),您仍然可以从“速率限制”、“配额”、“指标”等中获益。例如,对于日志,您可以通过策略创建带有用户标识(用户名、子声明等)的标题并将此标头发送到日志。对于速率限制,您可以使用用户名等作为速率限制的键谢谢!!!Ps,对于其他正在阅读的人,如果通过url传递订阅密钥,请使用订阅密钥={yourkey}而不是Ocp Apim订阅密钥={yourkey}。您可以创建一个新问题,您正在回答区域中键入