【发布时间】: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