应用服务上的Azure MSI

时间:2017-09-19 18:23:05

标签: azure-msi

我在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_环境变量。

这应该如何运作?这是现有的应用服务计划。

7 个答案:

答案 0 :(得分:2)

AppAuthentication库利用App Service中的内部端点,代表您网站接收令牌。此端点是非静态的,因此设置为环境变量。通过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));

}

我会尝试,看看我得到了什么样的回应。

答案 1 :(得分:1)

我在尝试将MSI与Function应用程序一起使用时解决了这个问题,尽管我已经设置了环境变量。我尝试多次重启但没有成功。我最终做的是手动关闭功能的MSI,然后重新启用它。这不太理想,但确实有效。

希望它有所帮助!

答案 2 :(得分:1)

我发现,如果启用MSI,然后换出插槽,则功能会随着插槽更改而消失。您可以通过将其关闭然后重新打开来重新启用它,但这将在AD中创建一个新的身份,并且需要您重置密钥库的权限才能使其正常工作。

答案 3 :(得分:1)

启用身份并通过访问策略授予在Keyvault中使用Azure功能应用程序的访问权限。 您可以在平台功能标签中找到身份 这两个步骤对我有用

答案 4 :(得分:1)

只需将状态切换为 ON (如@Sebastian Inones所示)即可。 比为KeyVault添加访问策略,例如 enter image description here

此问题已解决!

答案 5 :(得分:0)

就我而言,我忘记了在Key Vault中为应用程序添加访问策略

答案 6 :(得分:0)

对于那些像我自己一样的人,想知道如何启用MSI

我的情况: 我有一个App Service已经部署并运行了很长时间。 此外,在Azure DevOps上,我已将管道配置为自动交换我的部署槽位(分段/生产)。突然,在正常推送之后,由于上述问题,生产开始失败。

因此,要再次启用MSI (我不知道为什么必须重新启用MSI,但我认为这只是一种解决方法,而不是解决方案,因为它仍然应该首先启用)

转到您的应用服务。然后在设置->身份下。 检查状态:就我而言,它是关闭:(

我在下面附加了一张图片,以使后续操作更容易。

enter image description here