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

Multiple Authentication policies in Azure APIM

我有两种情况,第一种情况是客户端将使用不记名令牌调用 APIM,另一种情况是 Function App 将使用托管身份调用我们的 APIM。我有验证 jwt 的代码。但我想知道如果其中一个可用,我该如何跳过另一个(例如,如果使用托管身份调用它,我想跳过 jwt 验证)。从 examples 我可以看到我可以选择什么时候,但不确定托管身份的 headers 是什么。这是我认为我应该更新的内容。

<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>

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

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

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

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

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

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

然后检查策略中的header:

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