Azure active directory 试图以调用Azure IMDS的访问权限所禁止的方式访问套接字

Azure active directory 试图以调用Azure IMDS的访问权限所禁止的方式访问套接字,azure-active-directory,azure-managed-identity,Azure Active Directory,Azure Managed Identity,我无法从应用程序服务调用Azure实例元数据服务(IMDS)以获取令牌。我们有一个应用程序服务,创建时间超过18个月。最近,我们为它启用了托管标识。在azure门户页面上有一个描述MI以及如何使用它的页面 但是,当我尝试对http://169.254.169.254/metadata/identity/oauth2/token使用记录的参数,我总是会遇到一个异常试图以访问权限所禁止的方式访问套接字。是否需要启用一些本地配置,以便此端点工作?这是不是因为这个应用程序服务是很久以前创建的,所以无法正

我无法从应用程序服务调用Azure实例元数据服务(IMDS)以获取令牌。我们有一个应用程序服务,创建时间超过18个月。最近,我们为它启用了
托管标识
。在azure门户页面上有一个描述MI以及如何使用它的页面

但是,当我尝试对
http://169.254.169.254/metadata/identity/oauth2/token
使用记录的参数,我总是会遇到一个异常
试图以访问权限所禁止的方式访问套接字。
是否需要启用一些本地配置,以便此端点工作?这是不是因为这个应用程序服务是很久以前创建的,所以无法正常工作

我可以使用
MSI虚拟机扩展
并成功获得令牌,但文档提到该API应该在2019年1月被弃用。我还可以成功使用
Microsoft.Azure.Services.AppAuthentication
库并获取有效令牌

我更愿意打一个简单的REST电话,因为这是我们与其他相关服务通信的方式。下面是示例代码段

有人能帮我了解这里的最佳选择吗

MSI虚拟机扩展(工作正常,但记录为已弃用)

使用令牌提供者nuget(可以工作,但会向代码中添加另一个nuget)

调用Azure IMDS(抛出
试图以访问权限所禁止的方式访问套接字。

这个问题可能会更清楚,但IMDS只存在于Azure虚拟机上,并且特定于Azure虚拟机

要从应用程序服务获取访问令牌,请使用MSI_端点和MSI_SECRET环境变量。这就是您提供的前两个选项的工作方式(请参阅)。这两个示例也使用相同的REST调用/API版本,这意味着使用这两个选项中的任何一个在功能上都是等效的。因此,在这两个选项之间进行选择时,您的偏好会下降。:)


AppAuth library/Nuget中的AzureServiceTokenProvider确实提供了一层令牌检索逻辑的抽象,以及内置的令牌缓存,并简化了本地开发和产品/测试部署之间的身份验证体验。您可以阅读更多关于AppAuth库及其优点的信息。

我提供的链接来自Azure门户,当我查看我的应用程序服务的身份设置时。这是一个相当方便的地方,有这样一个链接,所以可能门户的人可以采取“创建一个应用程序服务特定的链接”错误或一个文档澄清错误。阅读有关
TokenProvider
的信息,似乎这对于使服务
无论部署在何处都能正常工作
很有用。谢谢你的澄清。谢谢你的信息!我可以肯定地看到这会导致混乱,我会看看我是否能找到合适的联系人来更新文档,让事情更清楚一点。
var endpoint = environment.MSI_ENDPOINT;
uri = new Uri($"{endpoint}?api-version=2017-09-01&resource=https://{audience}");
var req = new HttpRequestMessage(HttpMethod.Get, uri);
req.Headers.Add("Secret", environment.MSI_SECRET); 
var resp = await client.SendAsync(req);
var text = await resp.Content.ReadAsStringAsync();
var azureServiceTokenProvider = new AzureServiceTokenProvider();
token = await azureServiceTokenProvider.GetAccessTokenAsync($"https://{audience}/");
uri = new Uri($"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://{audience}");
var req = new HttpRequestMessage(HttpMethod.Get, uri);
req.Headers.Add("Metadata", "true"); // api requirement
var resp = await client.SendAsync(req);
var text = await resp.Content.ReadAsStringAsync();