【问题标题】:an attempt was made to access a socket in a way forbidden by its access permissions calling Azure IMDS尝试以调用 Azure IMDS 的访问权限禁止的方式访问套接字
【发布时间】:2019-07-11 15:31:10
【问题描述】:

我无法从应用服务调用 Azure 实例元数据服务 (IMDS) 以获取令牌。我们有一个 > 18 个月前创建的应用服务。最近我们为它启用了Managed Identity。在 azure 门户页面上,有一个 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 调用,因为这是我们与其他依赖服务进行通信的方式。示例 sn-ps 如下。

有人可以帮我理解这里的最佳选择吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我查看我的应用服务的身份设置时,我提供的链接来自 Azure 门户。这是一个相当方便的地方,有这样的链接,所以门户网站的人可能会采取“创建应用服务特定链接”错误或文档澄清错误。阅读有关TokenProvider 的信息似乎对于制作just work 服务很有用,无论它部署在哪里。感谢您的澄清。
    • 感谢您提供此信息!我绝对可以看到这会如何导致混乱,我会看看我是否能找到合适的联系人来更新文档并使事情变得更清晰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2020-04-24
    • 2018-05-24
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多