使用CreateMigrationJobEncrypted创建的迁移作业无法读取XML元数据文件
针对使用Microsoft.SharePoint.Client.Site.CreateMigrationJobEncrypted结合SPO预配容器读取加密XML元数据失败的问题,结合你尝试的三种方案,给出以下具体解决方向:
1. 修正加密流程的关键细节
方案1的XML解析错误大概率是加密/IV传递环节不符合SPO迁移服务的要求,需确认以下几点:
- 密钥处理:
containers.Value.EncryptionKey返回的是Base64编码字符串,需先解码为字节数组再用于AES-256-CBC加密:byte[] encryptionKey = Convert.FromBase64String(containers.Value.EncryptionKey); var encryptOption = new EncryptionOption { AES256CBCKey = encryptionKey, }; - IV规范:生成的IV必须是16字节(AES CBC强制要求),加密完成后将IV以Base64编码存入Blob元数据,键名固定为
MigrationIV(SPO迁移服务仅识别该键名获取IV):// 生成符合要求的IV byte[] iv = new byte[16]; RandomNumberGenerator.Fill(iv); string ivBase64 = Convert.ToBase64String(iv); // 上传Blob时添加元数据 blob.Metadata.Add("MigrationIV", ivBase64); blob.SetMetadata(); - 加密范围:对整个XML文件的字节流进行加密,而非文件内容的字符串形式,避免编码差异导致解密后XML损坏。
- 快照验证:确保迁移作业中指定的是Blob的快照URL,而非Blob的普通访问URL,SPO迁移服务仅读取快照版本的加密元数据。
2. 规范CreateMigrationJobEncrypted调用参数
调用方法时需确保MigrationJobInfo与预配容器、加密信息正确关联:
var jobInfo = new MigrationJobInfo { JobId = Guid.NewGuid(), MetadataBlobUri = new Uri(metadataBlobSnapshotUrl), // 加密元数据的快照URL ContainerUri = new Uri(containers.Value.MetadataContainerUri), // 预配的元数据容器URL QueueUri = new Uri(queue.Value.QueueUri), // 预配的进度队列URL // 其他必要参数配置... }; clientContext.Site.CreateMigrationJobEncrypted(jobInfo, encryptOption); clientContext.ExecuteQuery();
3. 本地验证加密解密流程
在本地用相同的密钥和IV对加密后的文件进行解密,确认解密结果是完整、可正常解析的XML文件,排除加密过程中出现的内容损坏问题。
4. 检查容器访问权限
确保执行迁移的账号对预配的元数据容器拥有读写权限,SPO迁移服务需要通过该账号权限访问容器内的加密元数据Blob。
内容的提问来源于stack exchange,提问作者RobertD
相关产品推荐
相关产品推荐

