使用CSOM向SharePoint Online上传文件报DEK未上传错误
问题答复
报错原因判定
触发的报错信息:
登录服务器无法颁发请求的紧凑型加密票据,原因是站点尚未上传数据加密密钥(Data Encryption Key, DEK)。
该报错并非由认证时使用个人Gmail邮箱账号直接导致:
- SharePoint Online是Microsoft 365组织级服务,若使用的Gmail账号未被目标租户邀请为访客、未分配站点权限,会直接在认证阶段抛出账号不存在或无权限错误,不会走到加密票据签发环节。能触发DEK相关报错,说明账号已经通过基础身份校验,问题根源在站点数据加密配置层面。
- 报错本质是目标站点开启了客户密钥(Customer Key)加密能力,但对应的DEK未正确上传、未完成全节点同步,导致安全令牌服务无法签发访问加密内容所需的合法票据。
排查解决步骤
- 基础账号权限校验:在浏览器中用代码里配置的
myEmail@gmail.com账号直接访问目标站点https://demoxxx.sharepoint.com/sites/FS_SI/,确认可正常登录、具备Documents文档库的上传权限,手动上传测试CSV文件验证操作权限正常。如果浏览器端无法登录或上传,先联系租户管理员将该Gmail账号添加为站点访客、分配文档库编辑权限,这是代码正常运行的基础,但和DEK报错无直接关联。 - 站点加密配置检查:使用租户全局管理员或SharePoint管理员账号登录Microsoft 365合规中心,查看客户密钥配置状态,确认目标站点对应的DEK已正确上传、处于生效状态。如果是刚完成DEK上传或客户密钥配置,需要等待最长24小时让密钥在SharePoint Online全节点同步,同步期间访问站点加密内容就会触发该类报错。
- CSOM认证逻辑修正:当前代码使用的
SharePointOnlineCredentials是基于账号密码的旧版传统认证方式,微软已在新租户中逐步默认禁用该认证模式,且旧认证逻辑和客户密钥加密场景存在已知兼容问题。建议替换为Azure AD OAuth认证模式,可通过PnP组件或者注册Azure AD应用的方式实现认证,规避认证链路兼容问题。
你当前使用的上传逻辑核心代码如下,仅需替换认证部分即可:using (ClientContext ctx = new ClientContext("https://demoxxx.sharepoint.com/sites/FS_SI/")) { ctx.AuthenticationMode = ClientAuthenticationMode.Default; SecureString securePassword = new SecureString(); foreach (char c in @"myPass@123") securePassword.AppendChar(c); ctx.Credentials = new SharePointOnlineCredentials("myEmail@gmail.com", securePassword); FileCreationInformation fcInfo = new FileCreationInformation(); fcInfo.Url = fileName; fcInfo.Overwrite = true; fcInfo.Content = System.IO.File.ReadAllBytes(content); Web myWeb = ctx.Web; List myLibrary = myWeb.Lists.GetByTitle("Documents"); myLibrary.RootFolder.Files.Add(fcInfo); ctx.ExecuteQuery(); }; - 故障定界验证:确认账号权限正常后,可由管理员临时关闭目标站点的客户密钥加密,再次运行代码测试上传,如果此时上传成功,即可100%确认故障由DEK配置或同步问题导致,后续重新上传对应DEK、等待同步完成后再开启客户密钥即可。
内容的提问来源于stack exchange,提问作者team-btg
相关产品推荐
相关产品推荐

