尝试将托管标识与 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 来支持两者。
我已经尝试按照 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 来支持两者。