2

我无法从应用服务调用 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();
4

1 回答 1

2

您提供的链接可能对此更清楚,但 IMDS 仅存在于 Azure VM 上并且特定于 Azure VM。

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

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

于 2019-07-11T18:33:59.620 回答