[英]Unable to get access to Key Vault using Azure MSI on App Service
我在应用服务上启用了托管服务标识。 但是,我的 WebJobs 似乎无法访问密钥。
他们报告:
Tried the following 3 methods to get an access token, but none of them worked. Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . Exception Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup. Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.microsoftonline.com/common. Exception Message: Tried to get token using Active Directory Integrated Authentication. Access token could not be acquired. password_required_for_managed_user: Password is required for managed user Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. 'az' is not recognized as an internal or external command,
Kudo 不显示任何 MSI_ 环境变量。
这应该如何工作? 这是现有的应用程序服务计划。
AppAuthentication 库利用应用服务中的内部端点代表您的站点接收令牌。 此端点是非静态的,因此设置为环境变量。 通过 ARM 为您的站点激活 MSI 后,您的站点将需要重新启动以在其中设置两个新的环境变量:
MSI_ENDPOINT和MSI_SECRET
这些变量的存在对于 MSI 功能在运行时正常工作至关重要,因为 AppAuthentication 库使用它们来获取授权令牌。 错误消息反映了这一点:
异常消息:尝试使用托管服务标识获取令牌。 无法连接到托管服务标识 (MSI) 端点。 请检查您是否在具有 MSI 设置的 Azure 资源上运行。
如果这些变量不存在,您可能需要重新启动站点。
https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity
如果设置了环境变量并且您仍然看到相同的错误,上面的文章有一个代码示例,显示了如何手动向该端点发送请求。
public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion) {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));
}
我会尝试一下,看看我得到什么样的回应。
我刚刚在尝试将 MSI 与 Function 应用程序一起使用时解决了这个问题,尽管我已经设置了环境变量。 我试过多次重启都没有成功。 我最终做的是手动关闭该功能的 MSI,然后重新启用它。 这并不理想,但它奏效了。
希望有帮助!
我发现如果您启用 MSI 然后换出插槽,则功能会随着插槽的变化而消失。 您可以通过将其关闭然后再次打开来重新启用它,但这将在 AD 中创建一个新身份,并且需要您重置密钥保管库的权限才能使其工作。
启用身份并通过访问策略授予对 keyvault 中的 azure 函数应用程序的访问权限。 您可以在平台功能选项卡中找到身份这两个步骤对我有用
就我而言,我忘记为 Key Vault 中的应用程序添加访问策略
对于会遇到这些答案的人,我想分享我的经验。
我在 Azure Synapse 管道运行时遇到了这个问题。 本质上,我向 KeyVault 添加了正确的访问策略,并且还向指向我的 KeyVault 的 Azure Synapse 添加了一个 LinkedService。
如果我手动触发笔记本,它会工作,但在管道中,它会失败。
最初,我使用了以下语句:
url = TokenLibrary.getSecret("mykeyvault", "ConnectionString")
然后我将链接服务的名称添加为第三个参数,管道能够利用该链接服务获取 Vault 的 MSI 令牌。
url = TokenLibrary.getSecret("mykeyvault", "ConnectionString", "AzureKeyVaultLinkedServiceName")
可能与您的问题无关,但我收到了相同的错误消息。
对我来说,问题是使用 pip3 的 azure-cli。 我能够通过为 azure-cli 和 azure-functions-core-tools 使用 brew 包来解决这个问题。
卸载 pip3 azure-cli
pip3 uninstall azure-cli
安装 brew azure-cli
brew update
brew install azure-cli
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.