MSA(个人OneDrive)中Files.ReadWrite.AppFolder权限初始化应用文件夹异常
问题场景
配置了User.Read和Files.ReadWrite.AppFolder Graph API权限的AAD应用,调用graphClient.Drive.Special.AppRoot.ItemWithPath(<random filename>).CreateUploadSession().Request().PostAsync()上传文件到用户OneDrive应用文件夹时,在MSA(个人OneDrive)环境下会触发Access Denied异常。但如果先临时添加Files.ReadWrite.All权限让用户授权,完成一次上传后移除该权限并重新认证,后续仅用原有权限就能正常调用API。
问题原因
MSA个人OneDrive的应用文件夹(AppRoot)首次使用时需要完成系统初始化流程。仅持有Files.ReadWrite.AppFolder权限时,由于文件夹尚未被触发创建,API调用时的权限校验会失败。而Files.ReadWrite.All的宽泛权限可以触发应用文件夹的首次创建,完成初始化后,Files.ReadWrite.AppFolder权限就能正常生效。
解决方案
方案1:临时权限初始化
首次引导用户授权时,临时加入Files.ReadWrite.All权限,完成一次应用文件夹的文件上传或创建操作后,移除该权限。后续仅使用User.Read+Files.ReadWrite.AppFolder权限即可正常调用上传API。
方案2:触发文件夹初始化(无需高权限)
尝试先调用graphClient.Drive.Special.AppRoot.Request().GetAsync()接口获取应用文件夹信息,触发MSA侧的文件夹初始化流程。如果首次调用该接口也返回权限异常,可添加一次重试逻辑,完成初始化后再执行上传操作。
内容的提问来源于stack exchange,提问作者Ian Clanton-Thuon

