我无法从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();
答案 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的更多信息。