尝试将托管标识与 Azure 服务总线一起使用

Trying to use Managed Identity with Azure Service Bus

我已经尝试按照 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 错误:

fail: Azure-Messaging-ServiceBus[82] An exception occurred while creating send link for Identifier: myqueue-578624f3-f732-4a9b-2ab0-9adc01949a5a. Error Message: 'System.UnauthorizedAccessException: Put token failed. status-code: 401, status-description: InvalidIssuer: Token issuer is invalid. TrackingId:cde3a89c-8108-48d1-8b8f-dacde18e176f, SystemTracker:NoSystemTracker, Timestamp: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);

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

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