Visual Studio 中的 Azure 服务总线托管标识返回 401 - 令牌颁发者无效

Azure Service Bus managed identity in Visual Studio returning 401 - Token issuer is invalid

我正在尝试使用代码中的托管标识访问 Azure 服务总线。目前我只是在本地尝试这个。

调试代码时出现以下错误

System.UnauthorizedAccessException: Put token failed. status-code: 401, status-description: InvalidIssuer: Token issuer is invalid

这是我的服务总线实例

这是我的用户Azure Service Bus Data Owner权限

这是我的代码

_client = new ServiceBusClient("oconnorevents.servicebus.windows.net", new DefaultAzureCredential());

我作为添加到服务总线的同一用户登录 Visual Studio。我也尝试通过 CLI 登录,但没有帮助。

我哪里错了?

我最近看过这个类似的问题,但提出的解决方案对我不起作用。

如果您使用 DefaultAzureCredential 进行身份验证,它将尝试几种凭证类型进行身份验证,如前所述 here, one of them is VisualStudioCredential,但它会向登录 VS 的用户的主 AAD 租户进行身份验证,在您的在这种情况下,我假设服务总线处于不在用户家庭租户下的订阅中。

我也可以在我这边重现你的问题。

直接使用VisualStudioCredential,然后通过VisualStudioCredentialOptions指定TenantId即可解决问题。

样本:

要找到 TenantId,只需导航到Azure Active Directory您的服务总线的订阅位于

TokenCredential tokenCredential = new VisualStudioCredential(new VisualStudioCredentialOptions {TenantId = "xxxxxxx" });
ServiceBusClient client = new ServiceBusClient("xxx.servicebus.windows.net", tokenCredential);

由于我可以访问多个不同的租户,Visual Studio 有时会感到困惑。处理此问题的另一种方法是继续使用 DefaultAzureCredential,但要提示 Visual Studio 使用哪个租户。
首先左键单击您的项目并检查属性,然后:

  1. 左键单击“调试”
  2. 左键单击“添加”按钮添加环境变量
  3. 名称使用“AZURE_TENANT_ID”,值使用您的租户 ID。是的,那是图片中的假租户 ID :-)

参考

通过将以下键添加到 local.settings.json 来指定确切的租户 ID。

"AZURE_TENANT_ID": "your tenant id"

我尝试创建一个 azure 函数,它使用托管身份触发器从服务总线队列接收消息,它对我有用。