我有两个场景,第一个客户端将使用承载令牌调用 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>
答案 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","") != "")">
..............