首页 > 解决方案 > 尝试将托管标识与 Azure 服务总线一起使用

问题描述

我已经尝试按照教程来验证我的服务总线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:放置令牌失败。status-code: 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);

标签: azureazureservicebusazure-managed-identity

解决方案


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

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


推荐阅读