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

时间:2019-07-11 15:31:10

标签: azure-active-directory azure-managed-identity

我无法从App Service调用Azure实例元数据服务(IMDS)来获取令牌。我们有一个在18个月前创建的应用程序服务。最近,我们为此启用了Managed Identity。在天蓝色的门户页面上,有一个great link描述了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 Extension(可以使用,但已记录为已弃用)

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();

1 个答案:

答案 0 :(得分:1)

link you provided对此可能更加清楚,但是IMDS仅存在于Azure VM上并且特定于Azure VM。

要从App Service获取访问令牌,请使用MSI_ENDPOINT和MSI_SECRET环境变量。这就是您给的前两个选项的工作方式(请参见implementation in AppAuth library)。这两个示例都使用相同的REST调用/ API版本,这意味着使用这两个选项在功能上是等效的。因此,在这两个选项之间进行选择时,会降低您的偏好。 :)

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