【问题标题】:Trying to use Managed Identity with Azure Service Bus尝试将托管标识与 Azure 服务总线一起使用
【发布时间】:2021-08-08 10:13:09
【问题描述】:

我已尝试遵循 this 教程来针对 DefaultAzureCredentials 验证我的服务总线,但是,我得到了 401。

我在设置中使用以下代码:

services.AddAzureClients(x =>
{
    x.AddServiceBusClientWithNamespace("myns.servicebus.windows.net")
        .WithCredential(new Azure.Identity.DefaultAzureCredential());
});

然后我这样调用 SB 客户端:

var sender = client.CreateSender("myqueue");
var message = new ServiceBusMessage(Encoding.UTF8.GetBytes("test"));

await sender.SendMessageAsync(message);

当我调用 SendMessageAsync 时,我收到 401 错误:

失败:Azure-Messaging-ServiceBus[82] 为标识符创建发送链接时发生异常:myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a。错误信息: 'System.UnauthorizedAccessException:放置令牌失败。状态码: 401、status-description: InvalidIssuer:令牌发行者无效。 TrackingId:cde3a89c-8108-48d1-8b8f-dacde18e176f, SystemTracker:NoSystemTracker,时间戳:2021-05-19T07:18:44。

在我运行这个之前,我打电话给az login。我可以访问命名空间来发送和接收。我的猜测是我需要在服务总线和......之间分配某种权限 - 但由于我将其作为控制台应用程序运行,因此我使用自己的凭据运行。显然,我不理解托管身份的某些内容。

编辑:

根据@juunas 的建议,我尝试了以下方法:

services.AddHostedService<ConsoleHostedService>();
services.AddAzureClients(x =>
{
    //var creds = new Azure.Identity.EnvironmentCredential(); // 1st - EnvironmentCredential authentication unavailable. Environment variables are not fully configured.'
    //var creds = new Azure.Identity.ManagedIdentityCredential(); // 2nd - No Managed Identity endpoint found
    //var creds = new Azure.Identity.SharedTokenCacheCredential(); // 3rd - 'SharedTokenCacheCredential authentication unavailable. No accounts were found in the cache.'
    //var creds = new Azure.Identity.VisualStudioCodeCredential(); // 4th - 'Stored credentials not found. Need to authenticate user in VSCode Azure Account.'
    //var creds = new Azure.Identity.AzureCliCredential(); // 5th
    var creds = new Azure.Identity.DefaultAzureCredential();
    
    x.AddServiceBusClientWithNamespace("myns.servicebus.windows.net")
        .WithCredential(creds);

【问题讨论】:

  • 您的代码在云端运行时失败了,还是在本地也失败了?
  • 尝试使用特定的凭证,然后检查是否仍然得到401。
  • 您是否尝试在命名空间级别将 Azure Service Bus Data Sender 分配给 MSI?
  • @GauravMantri - 仅限本地
  • @JimXu - 是的,我已授予数据发送者权限

标签: azure azureservicebus azure-managed-identity


【解决方案1】:

它说“令牌发行者无效”。 这意味着它获得了访问令牌,但它是由错误的 Azure AD 租户颁发的。 Az CLI 允许您使用 az login 上的 -t tenant-id-here 参数指定 Azure AD 租户 ID。

DefaultAzureCredential 也可能正在使用其他一些凭据(它会在 AzureCliCredential 之前尝试多个凭据,例如 VisualStudioCredential)。 您可以尝试直接使用AzureCliCredential 看看它是否有效。 这当然不会使用托管身份,因此您需要使用 ChainedTokenCredential 和 AZ CLI 凭据 + ManagedIdentityCredential 来支持两者。

【讨论】:

  • AzureCliCredential 有效 - 但我对为什么有点困惑。另外,如果这是我怀疑的,那么我的假设是 DefaultAzureCredential 做了你在 ChainedTokenCredential ... 中描述的事情?
  • 它尝试了一堆凭据,我猜是 Azure CLI 成功之前的其他凭据之一(VS / SharedTokenCache 等),但随后为错误的租户返回了一个令牌。
  • 我专门按顺序尝试了每个凭据(在此处列出 docs.microsoft.com/en-us/dotnet/api/…)。我原以为其中一个会给我从 DefaultAzureCredential 得到的相同错误,但他们没有 - 我从每个得到不同的错误(Cli 除外)
  • 好吧,这很奇怪.. 你从他们那里得到了什么错误?
  • 你试过VisualStudioCredential吗?这是您的列表中缺少的,但由 DefaultAzureCredential 使用。您可以在源代码中看到创建的凭据:github.com/Azure/azure-sdk-for-net/blob/…
猜你喜欢
  • 2022-12-19
  • 2021-01-24
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 2020-06-08
相关资源
最近更新 更多