首页 > 解决方案 > PowerShell 中的 IoT 中心共享访问签名

问题描述

如何使用 PowerShell 创建 IoT 中心共享访问签名。我的代码在使用 Azure IoT Explorer 中生成的签名时有效。假设签名生成有问题:

$Uri = "$IotHubName.azure-devices.net/devices/$IotDeviceId"
$Expiry = [string](([DateTimeOffset]::Now.ToUnixTimeSeconds())+3600)
$IotHubKeyDecoded = [System.Text.Encoding]::ASCII.GetString([System.Convert]::FromBase64String($IotHubKey)) 
$StringToSign = [System.Web.HttpUtility]::UrlEncode($Uri) + "`n" + $Expiry
$Hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$Hmacsha.key = [Text.Encoding]::ASCII.GetBytes($IotHubKeyDecoded)
$Signature = $Hmacsha.ComputeHash([Text.Encoding]::ASCII.GetBytes($StringToSign))
$Signature = [System.Web.HttpUtility]::UrlEncode([Convert]::ToBase64String($Signature))

我尝试使用 New-AzIotHubSasToken 但得到“未经授权”:

$SharedAccessSignature = New-AzIotHubSasToken -ResourceGroupName $IotHub.ResourceGroupName -IotHubName $IotHubName -DeviceId $IotDeviceId 
$Headers = @{"Authorization" = $SharedAccessSignature; "Content-Type"="application/json";} 
$Uri = "https://$IotHubName.azure-devices.net/devices/$IotDeviceId/messages/events?api-version=2020-03-13" 
Invoke-RestMethod -Uri $Uri -Headers $Headers -Method Post -Body $JsonBody

标签: powershellazure-iot-hub

解决方案


我不确定您为什么要尝试以这种方式创建 SAS 令牌,但您可以为此目的使用 PowerShell 或 Azure CLI(您必须先安装它)。

这里有两个例子:

# PowerShell
New-AzIotHubSasToken -IotHubName "{IoT Hub Name}" -DeviceId "{Device Id}" -ResourceGroupName "{Resource Group Name}"

# Output
SharedAccessSignature sr={IoT Hub Name}.azure-devices.net%2fdevices%2f{Device Id}&sig=iuhiAfagvhgd3QtqjukX8upPuWj%2fuJuYn%2bJgeOe6Uwo%3d&se=1604085022

# Azure CLI
az iot hub generate-sas-token -n {IoT Hub Name} -d {Device Id}

# Output
{
  "sas": "SharedAccessSignature sr={IoT Hub Name}.azure-devices.net%2fdevices%2f{Device Id}&sig=iuhiAfagvhgd3QtqjukX8upPuWj%2fuJuYn%2bJgeOe6Uwo%3d&se=1604085022"
}

请记住,您必须先登录然后选择相应的订阅(如果您有多个订阅)

az login
# Optionally: az account list
az account set --subscription {subscription id}

推荐阅读