无法获取 Azure 键值机密值
Posted
技术标签:
【中文标题】无法获取 Azure 键值机密值【英文标题】:Cannot get Azure Key Value secret values 【发布时间】:2020-03-02 08:31:12 【问题描述】:我正在尝试从我创建的 Azure 密钥保管库中获取机密(dbUser 密码)。当我运行下面的代码时,它会抛出无法获取有效令牌的异常。
public static string GetDBConnectString(ILogger logger)
try
string dbUserName = Environment.GetEnvironmentVariable("SqlDBUsername"); // [dbUserName]
logger.LogInformation($"Info: Creating DB Connection string as user dbUserName.");
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
string vaultConnect = Environment.GetEnvironmentVariable("SqlDBKeyvault"); // ["https://keyvault.vault.azure.net/secrets/dbUserName/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]
// The below line fails
SecretBundle secret = keyVaultClient.GetSecretAsync(vaultConnect).GetAwaiter().GetResult();
string sqlConnection = string.Format(Environment.GetEnvironmentVariable("SqlDBConnectionString"), dbUserName, secret.Value);
return sqlConnection;
catch (Exception ex)
logger.LogError(ex.Message, ex);
return string.Empty;
Exception.Message = "参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。异常消息:尝试了以下 3 种方法来获取访问令牌,但都没有工作。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。异常消息:尝试使用托管服务标识获取令牌。无法连接到托管服务标识 (MSI) 端点。请检查您是否在具有 MSI 设置的 Azure 资源上运行。 参数:连接字符串:[未指定连接字符串],资源:https://vault.azure.net,权限:https://login.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。 Visual Studio 令牌提供程序 Microsoft.Asal.TokenService.exe 的异常:TS003:错误,TS002:在租户“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”中找不到帐户“me@mycompany.com”。 "
我在这里看到了各种创建 ClientId 授权的解决方案,但所有这些都需要用户名/密码才能创建,这违背了保险库的目的?
有没有人提供不需要用户凭据来打开保险库的解决方案?
【问题讨论】:
【参考方案1】:以下代码更改适用于本地开发。仍然必须确定一种在部署时通用的方法。尝试使用“RunAs=App;AppId=valid app id”,但连接失败。
确保选择了工具 > 选项 > AzureServiceAuthentication 帐户,并且 VS 已连接到 Azure 云。
这行得通。
AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider("RunAs=Developer; DeveloperTool=VisualStudio");
【讨论】:
谢谢,在更新 Visual Studio 2019 后,我在 VS 选项中设置了首选 Azure 帐户,如上所述。【参考方案2】:有两种类型的身份:系统分配的身份和用户分配的身份。您需要的是系统分配的标识,您的 Azure 函数将用于从密钥保管库中检索机密。
您应该添加一个设置,该设置将从密钥库中检索它,而不是读取函数中的秘密值。
例子:
Key Value
MySecret @Microsoft.KeyVault(SecretUri=secret_uri_with_version)
然后在您的代码中,您将使用:
Environment.GetVariable("MySecret);
更多信息:
https://azure.microsoft.com/en-us/blog/simplifying-security-for-serverless-and-web-apps-with-azure-functions-and-app-service/
https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?tabs=dotnet
【讨论】:
我试过了,秘密的值作为“@Microsoft.KeyVault(...”而不是 sql 连接字符串需要的秘密值进入我的函数 仔细检查您是否在设置部分设置了不带双引号的机密。如果仍未从密钥保管库获取机密,则表示托管标识未正确设置或缺少获取/ 列出 Key Vault 的权限 应用服务系统托管标识需要获得访问策略角色的授权。一旦在云中同步,噗,效果很好。泰!以上是关于无法获取 Azure 键值机密值的主要内容,如果未能解决你的问题,请参考以下文章