当前位置: 首页 > 知识库问答 >
问题:

尝试在Azure服务总线中使用托管标识

谢裕
2023-03-14

我已经尝试按照本教程来验证我的服务总线对DefaultAzureCreentials,但是,我得到了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创建发送链接时发生异常。错误消息:“系统。UnauthorizedAccessException:放置令牌失败。状态代码:401,状态描述:InvalidIssuer:令牌颁发者无效。TrackingId:cde3a89c-8108-48d1-8b8f-DACDE118E176F,系统跟踪器:NoSystemTracker,时间戳:2021-05-19T07:18:44。

在我运行这个之前,我调用az log。我可以访问发送和接收的命名空间。我的猜测是,我需要在服务总线和...某些东西之间分配某种权限——但是因为我是作为控制台应用程序运行的,所以我是用自己的凭据运行的。很明显,有一些关于管理身份的事情我不明白。

编辑:

根据@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);

共有1个答案

卜凯旋
2023-03-14

它说“令牌颁发者无效”。这意味着它获得了一个访问令牌,但它是由错误的Azure AD租户颁发的。Az CLI允许您使用Az登录上的-t租户id此处参数指定Azure AD租户id。

DefaultAzureCredential也可以使用其他凭据(它尝试多个凭据,如AzureCliCredential之前的VisualStudioCredential)。相反,您可以尝试直接使用AzureCliCredential,看看它是否有效。这当然不会使用托管标识,所以您需要使用带有AZ CLI凭据ManagedIdtyCredential的ChainedTokenCredential来支持两者。

 类似资料:
  • 当尝试在Azure Gov中获取服务总线的托管标识令牌时,我尝试使用资源:https://servicebus.usgovcloudapi.net/而不是像商业(https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-managed-service-identity)那样https://servicebus.

  • 我在Azure中创建了一个ServiceBus命名空间,以及一个主题和一个订阅。我还有一个简单的Azure version 1函数,可在ServiceBus中的接收主题上触发,如下所示: 当我通过使用主题的共享访问策略在函数应用程序设置中定义连接字符串时,该函数会很好地触发ServiceBus中的主题,如下所示: 现在,我想使用托管服务标识(MSI)来访问服务总线,而不是共享访问密钥。根据这个(h

  • 现在我正在使用AAD应用程序使服务成为= AAD应用程序 流程如下所示: 服务A:从托管标识获取令牌 服务A:转到KeyVault,出示令牌并获取AAD应用程序的秘密 服务A:转到AAD,提供一个秘密并为特定资源请求一个令牌 服务A:拨打服务B 服务B:验证令牌和资源 我想知道是否可以向我的服务注册托管标识,因此如果提供托管标识令牌,则服务B可以信任服务A。类似于这样: 服务A:从托管身份获取令牌

  • 我们需要从Azure应用程序服务和Azure功能运行访问Azure服务总线(ASB)的应用程序。我们需要使用用户指定的身份进行身份验证。我们编写以下代码,用于系统分配的标识,但不用于用户分配的标识: 引发此错误: 所以核心错误是找不到指定ClientId/ResourceId的MSI 。看起来我们需要指定客户端id。然后我们发现https://github.com/Azure/azure-sdk-

  • Azure服务总线支持托管标识访问,但我发现向队列发送消息的唯一方法是使用这种需要代码和服务总线SDK的方法: 来源:https://github.com/Azure-Samples/app-service-msi-servicebus-dotnethttps://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-ma

  • 我在Azure中设置了两个应用程序服务。”父级和子级都公开APIendpoint。 子节点有endpointGet。 父节点有endpoint“获取”和“获取儿童”(使用HttpClient在儿童上调用“获取”)。 我希望所有子endpoint都需要通过托管身份和AAD进行身份验证,并且我希望所有父endpoint都允许匿名。但是在Azure中,我希望将父应用服务设置为具有调用子应用服务的权限。因