不同租户下SharePoint Access Token的scp值差异原因咨询
现象说明
解码租户A、租户B的SharePoint访问令牌时,两个令牌的scp声明返回值存在明显差异:
- 租户A令牌scp字段返回可读权限字符串:
"scp": "AllSites.FullControl User.Read User.ReadBasic.All"
- 租户B令牌scp字段返回带GUID的特殊值:
"scp": ".1f7f4061-caa1-44c4-b29a-6d877e9a5211"
当前令牌请求走授权码流,调用参数如下:
{ "grant_type", "authorization_code" }, { "client_id", azureConfig.ClientId }, { "client_secret", azureConfig.ClientSecret }, { "scope", "https://123435350365.sharepoint.com/.default"}, { "redirect_uri","url" }, { "code", code }
核心原因
Azure AD返回scp声明时,若能匹配到已发布的权限定义,就返回AllSites.FullControl这类可读字符串;如果匹配不到对应权限定义,就会直接返回.{权限对象ID}格式的值,这是平台原生返回逻辑,和令牌解码工具无关。出现跨租户差异的常见触发场景如下:
- 租户级权限同意状态不一致
请求https://<tenant>.sharepoint.com/.default范围时,服务端会返回当前租户对该应用已授予的所有静态委托权限。租户A已经由管理员完成了目标SharePoint权限(AllSites.FullControl等)的同意流程,权限定义匹配正常;租户B没有完成对应权限的管理员同意,服务主体上仅残留未完整配置的权限条目,就会返回ID格式的scp值。 - 多租户应用服务主体同步异常
多租户应用首次在租户B被使用时,会在租户B的Azure AD目录下生成本地服务主体。如果同步过程中出现网络波动、目录服务临时故障,会导致服务主体关联的权限定义没有完整拉取,权限ID无法映射到可读字符串,就会直接把ID返回到scp字段。 - 端点版本混用导致权限映射失败
如果应用注册时配置的是Azure AD v1.0端点的SharePoint权限,令牌请求却走v2.0端点,或者反过来,租户B目录的权限映射逻辑会出现兼容问题,无法正确解析权限名称。
处理步骤
- 用租户B的全局管理员/SharePoint管理员账号访问Azure AD管理员同意端点,针对需要的
AllSites.FullControl、User.Read等权限重新完成一次管理员同意,确保权限被正确授予到租户B下的对应服务主体。 - 进入租户B的Azure AD企业应用面板,找到对应client_id的服务主体,检查「权限」配置页,删除所有孤立的、无对应名称的权限条目,重新添加需要的SharePoint委托权限后再次执行同意。
- 统一令牌请求端点和应用注册的权限配置版本,不要混用v1.0和v2.0的权限配置,建议统一使用v2.0端点和对应版本的权限配置项。
内容的提问来源于stack exchange,提问作者DevÁsith
相关产品推荐
相关产品推荐

