我无法从应用服务调用 Azure 实例元数据服务 (IMDS) 以获取令牌。我们有一个 > 18 个月前创建的应用服务。最近我们启用Managed Identity
了它。在 azure 门户页面上有一个很好的链接,描述了 MI 以及如何使用它。
但是,当我尝试http://169.254.169.254/metadata/identity/oauth2/token
使用记录的参数进行 REST 调用时,我总是会遇到异常an attempt was made to access a socket in a way forbidden by its access permissions.
是否需要启用一些本地配置才能使该端点正常工作?这是因为这个应用服务是很久以前创建的吗?
我可以MSI VM Extension
成功使用并获取令牌,但文档提到此 API 应该在 2019 年 1 月弃用。我也可以Microsoft.Azure.Services.AppAuthentication
成功使用该库并获取有效令牌。
我更喜欢进行简单的 REST 调用,因为这是我们与其他依赖服务进行通信的方式。示例片段如下。
有人可以帮助我了解这里的最佳选择吗?
MSI VM 扩展(有效,但记录为已弃用)
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();
使用 TokenProvider nuget(有效,但在代码中添加了另一个 nuget)
var azureServiceTokenProvider = new AzureServiceTokenProvider();
token = await azureServiceTokenProvider.GetAccessTokenAsync($"https://{audience}/");
调用 Azure IMDS(抛出an attempt was made to access a socket in a way forbidden by its access permissions.
)
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();