从应用程序服务调用Azure实例元数据服务(IMDS)以获取令牌时遇到问题。我们有一个创建于18个月前的App Service。最近我们为它启用了Managed Identity。在azure门户页面上,有一个描述MI以及如何使用它的great link。
然而,当我尝试使用文档中的参数对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.,是否有一些我们需要启用的本地配置才能使这个端点工作?这是不是因为这个App Service在很久以前就创建了而无法工作?
我可以成功地使用MSI VM Extension并获取令牌,但文档中提到该接口应该在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();发布于 2019-07-12 02:34:00
link you provided可以更清楚地了解这一点,但是IMDS只存在于Azure VM上,并且特定于Azure VM。
要从应用程序服务获取访问令牌,可以使用MSI_ENDPOINT和MSI_SECRET环境变量。这就是您给出的前两个选项的工作原理(请参阅implementation in AppAuth library)。这两个示例也使用相同的REST调用/API版本,这意味着使用这两个选项中的任何一个在功能上都是等效的。因此,当在这两个选项之间进行选择时,它会降低您的偏好。:)
AppAuth库/Nuget中的AzureServiceTokenProvider确实提供了令牌检索逻辑的抽象层,以及内置的令牌缓存,并在本地开发和生产/测试部署之间提供了简化的身份验证体验。您可以阅读有关AppAuth库及其好处的更多信息here。
https://stackoverflow.com/questions/56992713
复制相似问题