azure - 尝试将托管标识与 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);
解决方案
它说“令牌发行者无效”。这意味着它获得了访问令牌,但它是由错误的 Azure AD 租户颁发的。Az CLI 允许您使用-t tenant-id-here
on 参数指定 Azure AD 租户 ID az login
。
DefaultAzureCredential
也可能正在使用其他一些凭据(它在 AzureCliCredential 之前尝试多个凭据,例如 VisualStudioCredential)。您可以尝试AzureCliCredential
直接使用,看看它是否有效。这当然不会使用托管身份,因此您需要使用ChainedTokenCredential
AZ CLI 凭据 + ManagedIdentityCredential 来支持两者。
推荐阅读
- android - 在 iOS 和 Android 的颤振项目中运行 firebase 的最低版本是什么?
- ruby-on-rails - 如何使用 Nokogiri 解析 Google 搜索页面以获取结果统计信息和 AdWords 计数
- acumatica - 用 Acumatica 模板中的自定义字符串替换空白字段
- java - 当我从应用程序类的主方法启动应用程序并使用 fxmloader 时出现 JavaFx IllegalAccessError
- react-native - 抽屉未导航到 React Native Navigation 5 中的下一个屏幕
- angular - 在 Angular / Jasmine 中扩展其他两个组件的测试组件
- flutter - Android SDK 管理器抛出异常 [Java 11 问题。请阅读说明]
- qt - QML 参考错误:
没有定义 - postgresql - 错误 500 注册 kafka 时无法创建 PG 连接将 PG 连接器与多个代理
- javascript - D3 用圆形旋转在饼图周围画线