无法获取 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 键值机密值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取自己键盘上按键的键值(KeyCode)

[677]. 键值映射

[677]. 键值映射

[java自学第九天]

Spark入门--Spark的combineByKeysortBykey

无法从 maxmind 返回对象中获取键值