AzureCliCredential/InteractiveBrowserCredential访问IoT Hub授权失败,能否个人账号认证?
问题
在VS Code的Polyglot Notebook环境中,执行命令az login --tenant xyz完成登录后,可通过以下Azure CLI命令成功获取IoT Hub设备孪生:
az iot hub device-twin show --hub-name 'hub1' --device-id 'John' --query 'properties.desired' --output json --subscription 'sub1'
但使用C#代码调用Azure SDK时,无论是使用AzureCliCredential还是InteractiveBrowserCredential创建RegistryManager,调用GetTwinAsync方法时均触发UnauthorizedException,错误信息为:
Error: Microsoft.Azure.Devices.Common.Exceptions.UnauthorizedException: {"Message":"ErrorCode:IotHubUnauthorized;Principal
@ .com is not authorized for GET on /twins/John due to no assigned permissions","ExceptionMessage":"Tracking ID:abc:0-TimeStamp:06/26/2023 07:44:12"}
而使用IoT Hub连接字符串创建RegistryManager则可正常获取设备孪生。
现咨询:能否使用个人账号通过AzureCliCredential/InteractiveBrowserCredential完成Azure认证?
使用的依赖库如下:
#i "nuget:https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json" #i "nuget:https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" #r "nuget:Azure.Identity" #r "nuget:Microsoft.Extensions.Azure" #r "nuget:Microsoft.Azure.Devices" using Azure.Identity; using Microsoft.Extensions.Azure; using Microsoft.Azure.Devices;
回答
可以用个人账号通过AzureCliCredential或InteractiveBrowserCredential完成Azure认证并访问IoT Hub设备孪生,报错核心原因是个人账号缺少IoT Hub数据平面的权限配置,而非认证方式本身的问题。
解决步骤
给个人账号分配IoT Hub数据平面权限
操作设备孪生属于IoT Hub的数据平面操作,需要给个人账号分配对应的RBAC角色,推荐选择:- IoT Hub数据读取者:仅支持读取设备孪生等数据操作
- IoT Hub数据所有者:支持读写等全量数据操作
操作路径:Azure门户进入目标IoT Hub → 「访问控制(IAM)」→ 「添加角色分配」→ 选择上述角色之一 → 搜索并选中你的个人账号 → 保存配置。
确保认证参数与CLI登录一致
- 使用
AzureCliCredential时,显式指定租户ID,避免跨租户认证问题:var credential = new AzureCliCredential(new AzureCliCredentialOptions { TenantId = "xyz" }); - 使用
InteractiveBrowserCredential时,同样指定租户ID:var credential = new InteractiveBrowserCredential(new InteractiveBrowserCredentialOptions { TenantId = "xyz" });
- 使用
正确初始化RegistryManager
必须使用IoT Hub主机名(格式:{hubName}.azure-devices.net)而非连接字符串,结合Credential完成初始化:var registryManager = await RegistryManager.CreateAsync("hub1.azure-devices.net", credential); var twin = await registryManager.GetTwinAsync("John");
补充说明
Azure CLI能成功执行是因为CLI内部会自动处理权限映射,但SDK需要明确确保账号拥有对应的数据平面RBAC权限;而IoT Hub连接字符串使用的是共享访问密钥,本身已包含设备孪生操作的权限,因此可以正常工作。
内容的提问来源于stack exchange,提问作者tmaj

