Visual Studio中的Azure Service Bus托管标识返回401 -令牌颁发者无效

ef1yzkbh  于 2023-02-05  发布在  其他
关注(0)|答案(4)|浏览(119)

我正在尝试使用代码中的托管标识访问Azure Service Bus。目前我只是在本地尝试此操作。
当我调试代码时,我得到以下错误
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登录,但没有帮助。
我到底哪里错了?
我最近也看过类似的问题here,但提出的解决方案对我不起作用。

hwamh0ep

hwamh0ep1#

由于我可以访问几个不同的租户,Visual Studio有时会感到困惑。另一种处理此问题的方法是继续使用DefaultAzureCredential,但向Visual Studio提供有关要使用哪个租户的提示。
x1c 0d1x首先左键单击您的项目并检查属性,然后:
1.左键单击“调试”
1.左键单击“Add”按钮添加环境变量
1.名称使用“AZURE_TENANT_ID”,值使用您的租户ID。是的,图片中的租户ID是假的:-)
参考文献

ttygqcqt

ttygqcqt2#

如果您使用DefaultAzureCredential进行身份验证,它将尝试几种凭据类型进行身份验证,如前面提到的here,其中之一是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);

laik7k3q

laik7k3q3#

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

"AZURE_TENANT_ID": "your tenant id"

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

omqzjyyz

omqzjyyz4#

我迟到了,但我得到了我的本地Visual Studio与此代码的工作

var tokenCredential = new VisualStudioCredential(new VisualStudioCredentialOptions { TenantId = "xxx-xxx" });

ServiceBusClient client = new ServiceBusClient("my-name-space.servicebus.windows.net", tokenCredential);

sender = client.CreateSender('my-topic');

var msgBody = new Person{ Name = 'joe'};

await sender.SendMessageAsync(new ServiceBusMessage(JsonConvert.SerializeObject(msgBody)));

此外,请记住在Visual Studio中登录Azure,并将您的帐户分配给角色“Azure服务总线数据发送方”,请参见下文:

相关问题