Microsoft Graph API /common与/{{tenantId}}差异及权限问题解析
/common 与指定 {{tenantId}} 授权端点的差异解析
核心区别
1. 租户身份与应用定位
- /common:多租户应用的通用登录入口,允许任何Azure AD租户的用户登录。用户登录时,系统会自动识别其所属租户,同时你的应用会以"多租户应用"的身份在该用户的租户中创建服务主体(首次登录时生成)。此时生成的访问令牌针对用户所在目标租户,权限边界也限定在该租户内。
- /{{tenantId}}:指定租户的专属登录入口,仅允许该{{tenantId}}对应租户的用户登录。此时你的应用是以原创建租户(john@xyz.com所在租户)的外部应用身份访问目标租户资源,生成的令牌虽指向目标租户,但应用的权限仅来自原租户的配置——目标租户并未给这个外部应用授予任何访问权限。
2. 权限生效逻辑(结合你的问题)
你遇到的/users接口权限问题,核心原因就在这里:
- 用
/common时:
你配置的委托权限会随用户身份传递到目标租户,只要当前登录用户本身拥有读取租户用户列表的权限(比如用户是目标租户的普通员工且有目录读取权限,或是管理员),就能成功调用/users。而/me和/groups本身是访问用户自身的信息和所属群组,属于用户默认拥有的权限范围,所以一直能正常调用。 - 用
/{{tenantId}}时:
你的应用是原租户的外部应用,目标租户并未给它授予访问租户用户列表的权限。你在原租户配置的User.Read.All这类权限,只能访问原租户的用户数据,无法作用于目标租户。但/me和/groups是用户自身的资源,不需要应用拥有租户级权限,所以依然能正常调用。
3. 适用场景
- /common:适合需要支持跨租户用户登录的SaaS类多租户应用。
- /{{tenantId}}:适合仅允许特定租户用户登录的内部应用,或是应用仅需要访问原租户自身资源的场景。
内容的提问来源于stack exchange,提问作者Harsh Joshi
相关产品推荐
相关产品推荐

