使用查询参数获取令牌的 Azure API 管理策略

Posted

技术标签:

【中文标题】使用查询参数获取令牌的 Azure API 管理策略【英文标题】:Azure API Management policy to get token with query parameters 【发布时间】:2021-12-30 02:41:00 【问题描述】:

我希望为银行账户验证实施 Azure API 管理策略,作为该 API 的一部分,我想调用令牌端点并将其传递给银行账户验证。我遇到的问题是设置入站发送请求策略以接受来自 NamedValues/KeyVault 的查询参数。

令牌验证网址如下:

https://apps.applyfinancial.co.uk/validate-api/rest/authenticate?username=USERNAME.com&password=PASSWORD

我尝试使用 set-query-parameter 策略,但根据以下验证错误,在发送请求节点中似乎不允许这样做:

第 16 行第 10 列元素“发送请求”中的错误:该元素 “发送请求”具有无效的子元素“设置查询参数”。列表 预期的可能元素:'set-header, set-body, 身份验证证书,身份验证令牌, 身份验证令牌存储,身份验证托管身份,代理”。 一个或多个字段包含不正确的值:;元素错误 第 16 行第 10 列的“发送请求”:元素“发送请求”具有 无效的子元素“设置查询参数”。可能的元素列表 预期:'set-header, set-body, authentication-certificate, 身份验证令牌,身份验证令牌存储, 身份验证管理的身份,代理”。

政策

<policies>
    <inbound>
        <!-- Send request to Token Server to validate token (see RFC 7662) -->
        <send-request mode="new" response-variable-name="tokenstate" timeout="20" ignore-error="true">
            <set-url>https://apps.applyfinancial.co.uk/validate-api/rest/authenticate</set-url>
            <set-method>POST</set-method>

            <set-query-parameter name="username" exists-action="override">
                <value>BankValidationUsername</value>
            </set-query-parameter>

            <set-query-parameter name="password" exists-action="override">
                <value>BankValidationPassword</value>
            </set-query-parameter>
        </send-request>

        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

我的问题是如何在 API 策略的发送请求部分设置查询参数?

【问题讨论】:

我们可以在 API 政策中发送请求,请您检查一下MS DOC,可能会有所帮助 我已经读过了。它没有回答这个问题。 【参考方案1】:

好的,

您不能在发送请求的范围内设置查询参数,但可以在 ionbound 策略内进行。此外,将 KeyVault 托管的命名值拉入变量并以这种方式在请求中使用它们似乎更好。

<policies>
    <inbound>
        <rewrite-uri template="/" />
        <set-variable name="username" value="BankValidationUsername" />
        <set-variable name="password" value="BankValidationPassword" />
        <set-variable name="errorresponse" value="" />
        <send-request mode="new" response-variable-name="tokenstate" ignore-error="false">
            <set-url>@($"https://apps.applyfinancial.co.uk/validate-api/rest/authenticate?username=(string)context.Variables["username"]&password=(string)context.Variables["password"]")</set-url>
            <set-method>POST</set-method>
        </send-request>
        <set-query-parameter name="token" exists-action="override">
            <value>@((string)((IResponse)context.Variables["tokenstate"]).Body.As<JObject>()["token"])</value>
        </set-query-parameter>
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <set-header name="ErrorSource" exists-action="override">
            <value>@(context.LastError.Source)</value>
        </set-header>
        <set-header name="ErrorReason" exists-action="override">
            <value>@(context.LastError.Reason)</value>
        </set-header>
        <set-header name="ErrorMessage" exists-action="override">
            <value>@(context.LastError.Message)</value>
        </set-header>
        <set-header name="ErrorScope" exists-action="override">
            <value>@(context.LastError.Scope)</value>
        </set-header>
        <set-header name="ErrorSection" exists-action="override">
            <value>@(context.LastError.Section)</value>
        </set-header>
        <set-header name="ErrorPath" exists-action="override">
            <value>@(context.LastError.Path)</value>
        </set-header>
        <set-header name="ErrorPolicyId" exists-action="override">
            <value>@(context.LastError.PolicyId)</value>
        </set-header>
        <set-header name="ErrorStatusCode" exists-action="override">
            <value>@(context.Response.StatusCode.ToString())</value>
        </set-header>
        <base />
    </on-error>
</policies>

【讨论】:

以上是关于使用查询参数获取令牌的 Azure API 管理策略的主要内容,如果未能解决你的问题,请参考以下文章

Azure API 管理:使用 Oauth2 401 的授权给出“未经授权。访问令牌丢失或无效。”

通过 Azure API 管理生成访问令牌并针对 IdentityServer4 进行验证

我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗

您如何从 Azure Active Directory 中获取搭建的 Weather Forecast Api 将接受的访问令牌?

使用 JWT 令牌保护 asp.net 核心 Web api 时如何从 Azure AD 获取用户

通过 JWT 令牌在 Azure API 管理中进行授权