You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程重新生成Azure DPS注册组的对称密钥?

解决Azure DPS注册组对称密钥重新生成的问题

先排查404错误的核心原因

  • 确认DPS服务终结点完整且正确,格式应为https://<你的DPS名称>.azure-devices-provisioning.net
  • 检查注册组ID的拼写,注意大小写敏感,确保目标注册组确实存在
  • 验证权限:使用的SAS令牌或AD凭据必须拥有EnrollmentGroupsWrite权限,权限不足也可能伪装成404错误

编程实现密钥重新生成的两种方法

目前Azure IoT C# SDK的ProvisioningServiceClient并未直接封装"重新生成密钥"的方法,你可以通过以下两种方式实现:

方法1:直接调用REST API(推荐)

构造PATCH请求,通过指定regenerateKey操作来触发密钥重新生成,示例代码如下:

using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;

// 替换为你的DPS信息
var dpsEndpoint = "https://<你的DPS名称>.azure-devices-provisioning.net";
var enrollmentGroupId = "<目标注册组ID>";
var sasToken = "<你的SAS令牌>"; // 或使用AD OAuth2令牌

var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("SharedAccessSignature", sasToken);

// 构造JSON Patch请求体,指定重新生成主密钥或辅助密钥
var patchOperations = new[]
{
    new
    {
        op = "replace",
        path = "/regenerateKey",
        value = "primary" // 替换为"secondary"可重新生成辅助密钥
    }
};

var content = new StringContent(
    JsonConvert.SerializeObject(patchOperations),
    Encoding.UTF8,
    "application/json-patch+json"
);

var response = await httpClient.PatchAsync(
    $"{dpsEndpoint}/enrollmentGroups/{enrollmentGroupId}?api-version=2021-06-01",
    content
);

if (response.IsSuccessStatusCode)
{
    var updatedEnrollment = await response.Content.ReadAsStringAsync();
    // 解析返回结果,获取新生成的密钥
}
else
{
    var errorDetails = await response.Content.ReadAsStringAsync();
    // 处理错误,比如打印错误信息排查
}

方法2:借助SDK的更新能力(间接实现)

如果想基于现有SDK扩展,可以先获取目标注册组,然后通过构造JSON补丁的方式调用UpdateEnrollmentGroupAsync,本质和直接调用API逻辑一致,只是借助SDK的HTTP客户端封装:

using Microsoft.Azure.Devices.Provisioning.Service;
using System.Net.Http;
using System.Text;
using Newtonsoft.Json;

var provisioningClient = ProvisioningServiceClient.CreateFromConnectionString("<你的DPS连接字符串>");
var enrollmentGroupId = "<目标注册组ID>";

// 获取现有注册组
var existingEnrollment = await provisioningClient.GetEnrollmentGroupAsync(enrollmentGroupId);

// 构造Patch请求体
var patchOperations = new[]
{
    new
    {
        op = "replace",
        path = "/regenerateKey",
        value = "secondary"
    }
};

// 借助SDK的HttpClient发送请求
var httpClient = provisioningClient.HttpClient;
var content = new StringContent(
    JsonConvert.SerializeObject(patchOperations),
    Encoding.UTF8,
    "application/json-patch+json"
);

var requestUri = $"/enrollmentGroups/{enrollmentGroupId}?api-version=2021-06-01";
var response = await httpClient.PatchAsync(requestUri, content);

// 处理响应逻辑同方法1

注意事项

  • 确保使用的API版本为稳定版(如2021-06-01及以上),旧版本可能不支持该操作
  • 重新生成密钥后,所有使用旧密钥的设备将无法完成注册,需同步更新设备端的密钥信息

内容的提问来源于stack exchange,提问作者Haad Baig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:10:15