Azure:从 App Service 访问 Key Vault 时如何修复 "The policy requires the caller '...' to use on-behalf-of (OBO) flow"?

Azure: How to fix "The policy requires the caller '...' to use on-behalf-of (OBO) flow" when accessing Key Vault from App Service?

我在 Azure 应用服务中有一个 ASP.net Core 3.1 应用程序 运行。开始使用 Azure Key Vault 存储应用程序的连接字符串和其他机密后,该应用程序现在崩溃并显示 “HTTP 错误 500.30 ANCM 进程内启动失败”错误页面。

我上下搜索了 Azure 门户,最终设法在应用服务的 .NET Core 启动失败列表中找到了一些有意义的内容(隐藏在 应用服务 > 诊断和解决问题 > Web 下App Down > 查看 .NET 启动失败):

Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: The policy requires the caller 
'appid=<redacted>;oid=<redacted>;iss=https://sts.windows.net/<readacted>/' to use on-behalf-of (OBO) 
flow. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287

我不需要代流。我最初确实错误地定义了 Key Vault 访问策略以包含应用程序的 oid 及其 appid。从那以后,我通过删除访问策略并在没有 appid.

的情况下重新创建它来进行补救

我的问题是 - 为什么我仍然收到此错误,我该如何解决?

更新:下面是似乎触发此操作的代码。禁用它后,应用程序恢复正常(尽管没有 Key Vault 集成)。

    var builtConfig = config.Build();
    var vaultUrl = $"https://{builtConfig["KeyVaultName"]}.vault.azure.net/";
    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    var keyVaultClient = new KeyVaultClient(
        new KeyVaultClient.AuthenticationCallback(
            azureServiceTokenProvider.KeyVaultTokenCallback));
    config.AddAzureKeyVault(
        vaultUrl,
        keyVaultClient,
            new DefaultKeyVaultSecretManager());

当您添加访问策略时,它只能 select 具有对象 ID 的服务主体。

如您所述,您删除了 appid 并确保您已单击 save 按钮以保存您的操作。

您可以通过为密钥保管库设置密钥保管库访问策略来授予数据平面访问权限。要设置这些访问策略,用户、组或应用程序 必须对该密钥保管库的管理平面具有贡献者权限

更多细节,你可以参考这个article