Azure APIM 中的多个身份验证策略

时间:2021-05-04 13:49:15

标签: azure authentication azure-api-management

我有两个场景,第一个客户端将使用承载令牌调用 APIM,另一个是函数应用程序将使用托管身份调用我们的 APIM。我有验证 jwt 的代码。但我想知道如果有一个可用,我如何跳过另一个(例如,如果使用托管标识调用 jwt 验证,我想跳过它)。从 examples 我可以看到我可以做一个选择,但不确定托管身份的标头是什么。这是我认为我应该更新的内容。

<choose>
    <when condition="@(context.Request.Headers.GetValueOrDefault("Authorization","") != "")">
         <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Invalid or Expired token" require-expiration-time="true" require-signed-tokens="true">
            <openid-config url=".well-known/openid-configuration" />
            <audiences>
                <audience>audience</audience>
            </audiences>
            <issuers>
                <issuer>issuer</issuer>
            </issuers>
        </validate-jwt>
    </when>
<when condition="to validate managed identity">
<authentication-managed-identity resource="resource" client-id="clientid of user-assigned identity" output-token-variable-name="token-variable" ignore-error="true|false"/>
</when>
</choose>

1 个答案:

答案 0 :(得分:0)

对于这个要求,我认为这两个请求之间没有任何区别(直接使用承载令牌请求 APIM 和通过托管身份从函数应用程序请求 APIM)。他们都将在请求的标头(授权)中提供一个不记名令牌。

您可以参考此 document 关于根据托管标识从函数应用调用 APIM。您可以在文档中找到如下所示的代码行,用于获取访问令牌并在请求 APIM 时在标头中设置令牌。

var azureServiceTokenProvider = new AzureServiceTokenProvider(identity);
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync(target,tenantID);

wc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

所以第二个请求场景与第一个请求场景相同。我们无法在 <validate-jwt> 之前的 APIM 策略中区分它们。为了实现您的要求,我认为您可以在两个请求的标头中添加一个属性,然后在 APIM 策略中检查标头。例如,在函数应用代码中,您可以添加如下标题:

httpClient.DefaultRequestHeaders.Add("comeFrom", "fromFunApp");

然后检查策略中的标题:

<choose>
    <when condition="@(context.Request.Headers.GetValueOrDefault("comeFrom","") != "fromFunApp" && context.Request.Headers.GetValueOrDefault("Authorization","") != "")">
    ..............