我计划在我的策略中使用 Azure API 管理的“凭据管理器”,以便验证请求并生成要在每个请求中发送到后端的不记名令牌将由 Azure APIM 而不是后端 API 负责。
为此,我已经在 Azure Entra ID 中注册了 API,并且能够使用客户端凭据流生成不记名令牌。我还可以使用 postman 通过 APIM 测试端点。
在调用 APIM 端点之前生成令牌并将其添加到标头中。到目前为止,所有这些都运行良好。
由于我想使用 APIM 提供的开箱即用解决方案来简化此过程,并使用其“凭据管理器”功能,因此我通过提供所需的详细信息(客户端 ID、秘密、租户 ID、资源)来配置凭据管理器。 url) 为选定的身份提供程序“Azure Active Directory v1”并授予类型“客户端凭据”。凭证管理器能够建立连接而不会出现任何错误。
现在,因为我想在我的 API 策略中使用它来生成令牌,所以我使用了策略“get-authorization-context”。 但是,当我测试 API 时,收到错误“对象引用未设置为对象的实例。”
这是我的测试 API 政策:
<inbound>
<base />
<get-authorization-context provider-id="aad-provider" authorization-id="aad-connection" identity-type="jwt" context-variable-name="auth-context" />
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value>
</set-header>
</inbound>
这是使用凭证管理器的正确方法吗?我不确定“身份类型”字段,它是 jwt 还是托管?
非常感谢任何帮助。
您需要在get-authorization-context
中使用托管,您的策略应如下所示。
<policies>
<inbound>
<base />
<get-authorization-context provider-id="aad-provider" authorization-id="aad-connection" context-variable-name="auth-context" identity-type="managed" ignore-error="false" />
<set-header name="Authorization" exists-action="override">
<value>@("Bearer " + ((Authorization)context.Variables.GetValueOrDefault("auth-context"))?.AccessToken)</value>
</set-header>
</inbound>
</policies>
正如您提到的,连接已在凭据管理器中成功建立,那么您需要在操作级别或 API 级别添加此策略来测试它。
此外,在注册的应用程序中添加连接的重定向网址。