首页 > 解决方案 > 使用 keyvault 中的连接字符串运行 dotnet EF 迁移时出现 Azure devops 管道错误

问题描述

这里有很多类似于我的问题,但似乎没有一个有助于解决问题,因此是一个新问题。我正在连接到一个密钥库,它使用 Program.cs 文件中的 .net Web api 应用程序中的以下代码返回 db 连接字符串

var kVUri = $"https://{config["azureKeyVault:vault"]}.vault.azure.net/";

var azureServiceTokenProvider = new AzureServiceTokenProvider();

var keyVaultClient = new KeyVaultClient(
    new KeyVaultClient.AuthenticationCallback(
        azureServiceTokenProvider.KeyVaultTokenCallback)
);

configurationBuilder.AddAzureKeyVault(kVUri, keyVaultClient, new DefaultKeyVaultSecretManager());

上面的代码在本地工作得很好,因为我可以访问密钥库,但是当将代码部署到构建时,dotnet ef 迁移的任务失败了。这是一个 cmdline 任务,正在运行“dotnet ef migrations script ...”错误是“Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException:参数:连接字符串:[未指定连接字符串]”

我已经确保在应用服务中打开了 MI,在 AD 中有一个应用注册,并且该服务已被授予对 Key Vault 的权限,运行管道的服务连接也具有对 Vault 的权限。

当使用 clientId 和 secret 完成与 keyvault 的连接时,EF 迁移用于运行。我读到我需要添加 RunAs=app 但这似乎是如果我使用 cli 调用 servicetokenprovider,在这种情况下我不是,如果它确实需要进入管道,不确定它需要去哪里。

一些帮助将不胜感激。

标签: entity-framework-coreazure-keyvaultazure-cliazure-authentication

解决方案


从评论中总结以供其他社区参考:

在使用服务主体进行身份验证的 Az CLI 会话中运行命令,并且应该为服务主体分配对 keyvault 的访问权限。


推荐阅读