无法在 APIM 中对托管身份令牌使用验证 jwt

unable to use validate jwt in APIM for managed Identity token

我们在 APIM 中有一个验证 jwt 策略来验证 jwt 令牌。我们正在使用 azure.identity 库从我们的函数应用程序生成令牌。到目前为止,我们使用系统分配的身份通过以下方法生成令牌。

var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new string[] { "https://management.azure.com" + "/.default" }) { });

令牌生成成功。并且我们能够成功验证策略中的令牌。以下是 APIM xml 政策。

<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="https://login.microsoftonline.com/tenantid/v2.0/.well-known/openid-configuration" />
                <audiences>
                    <audience>https://management.azure.com</audience>
                </audiences>
                <issuers>
                    <issuer>https://sts.windows.net/tenantid/</issuer>
                </issuers>
                <required-claims>
                    <claim name="oid" match="any">
                        <value>objectid of the managed identity/system assigned</value>
                    </claim>
                </required-claims>
            </validate-jwt>

现在我们已经分配了用户管理的身份并使用以下代码将身份分配给功能应用程序我能够生成令牌但在 APIM 中它抛出了奇怪的错误。

var azureServiceTokenProvider = new ManagedIdentityCredential(clientId: "client-id-of-managed-identity-id");
accessToken = await azureServiceTokenProvider.GetTokenAsync(new Azure.Core.TokenRequestContext(new[] { "https://management.azure.com" + "/.default" }));

APIM 告诉我们

“JWT 验证失败:IDX10501:签名验证失败。无法匹配密钥:\nkid:''。\n捕获异常:\n''。

关于如何克服这个问题有什么想法吗?

我更新了我的代码以使用 DefaultAzureCredential 而不是 ManagedIdentityCredential,它开始工作了。

var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions
                { ManagedIdentityClientId = "managed_identity_clinet_id" });
AccessToken accessToken = await credential.GetTokenAsync(
                    new TokenRequestContext(scopes: new string[] { "https://management.azure.com" + "/.default" }) { });

我传递了托管身份的客户端 ID,并且能够继续使用生成的令牌。