当用户登录到某个应用并使用它访问其他资源(例如 Microsoft Graph)时,该应用首先需要代表用户请求此资源的访问权限。 这种常见方案称为委托访问。
为何应使用委托访问?
人们经常使用不同的应用程序从云服务访问数据。 例如,有人使用其偏好的 PDF 阅读器应用程序来查看存储在 OneDrive 中的文件。 还有人使用公司的业务线应用程序检索有关同事的共享信息,以便可以轻松地为请求选择评审者。 在这种情况下,需要授权客户端应用程序、PDF 阅读器或公司的请求审批工具代表应用程序的登录用户访问这些数据。
每当你想要让登录用户处理其自己的资源或有权访问的资源时,都可以使用委托访问。 无论是管理员为整个组织设置策略,还是用户删除其收件箱中的电子邮件,所有涉及到用户操作的方案都应使用委托访问。

相反,对于必须在没有用户登录的情况下运行的方案(例如自动化),委托访问通常是不合适的选择。 对于涉及到访问许多用户资源的方案(例如数据丢失防护或备份),委托访问也可能是不合适的选择。 对于此类操作,请考虑使用仅限应用程序的访问。
作为客户端应用请求范围
应用需要请求用户为你要访问的资源应用授予特定的范围或范围集。 范围也可以称为委托的权限。 这些范围描述了应用要代表用户访问哪些资源和执行哪些操作。 例如,如果你希望应用向用户显示最近收到的邮件和聊天消息列表,可以请求用户同意 Microsoft Graph Mail.Read 和 Chat.Read 范围。
应用请求范围后,用户或管理员需要授予请求的访问权限。 拥有 Microsoft 帐户(例如 Outlook.com 或 Xbox Live 帐户)的使用者用户始终可为自己授予范围。 拥有 Microsoft Entra 帐户的组织用户是否可授予范围取决于其组织的设置。 如果组织用户无法直接同意范围,则他们需要请求其组织的管理员代表他们同意。
始终遵循最低特权原则:永远不要请求应用不需要的范围。 如果应用遭到入侵,此原则将有助于遏制安全风险,并使管理员更方便地授予应用访问权限。 例如,如果应用只需列出某个用户所属的聊天但不需要显示聊天消息本身,则你应该请求更有限的 Microsoft Graph Chat.ReadBasic 范围而不是 Chat.Read。 有关 OpenID 范围的详细信息,请参阅 OpenID 范围。
为资源服务设计和发布范围
如果你正在生成一个 API 并想要代表用户允许委托访问,则需要创建其他应用可以请求的范围。 这些范围应描述客户端可用的操作或资源。 设计范围时,应考虑开发人员方案。
向自身请求令牌
在以下场景中:
- 资源应用程序和客户端应用程序相同。
- 应用程序没有注册的 Web API。
- 应用程序正在为它自己公开的委托的权限请求令牌
此令牌请求不需要或显示同意。 此外,在租户中创建并向自己请求令牌的应用程序可以被推断为已经有权访问配置文件数据,并将自动授予配置文件访问权限。
委托访问的工作原理
对于委托访问,要牢记的一个重点是,客户端应用和登录用户都需要获得适当的授权。 仅仅授予范围并不足够。 如果客户端应用没有正确的范围,或者用户没有足够的权限来读取或修改资源,则调用将会失败。
- 客户端应用授权 - 通过授予范围来为客户端应用授权。 当用户或管理员为客户端应用授予访问某些资源的范围时,将在 Microsoft Entra ID 中记录这种范围授予。 随后,由客户端请求的、用于代表相关用户访问资源的所有委托访问令牌将在
scp声明中包含这些范围的声明值。 资源应用将检查此声明,以确定是否为客户端应用授予正确的调用范围。 - 用户授权 - 用户由你调用的资源授权。 资源应用可以使用一个或多个系统进行用户授权,例如基于角色的访问控制、所有权/成员身份关系、访问控制列表或其他检查。 例如,Microsoft Entra ID 在允许用户删除组织的应用程序之前,会检查是否为该用户分配了应用管理角色或一般的管理员角色,但也允许所有用户删除他们拥有的应用程序。 同样,SharePoint Online 服务在允许用户打开某个文件之前,会检查该用户是否对该文件拥有适当的所有者或读取者权限。
委托访问示例 – 通过 Microsoft Graph 访问 OneDrive
请考虑以下示例:
Alice 想要使用客户端应用打开某个受资源 API Microsoft Graph 保护的文件。 对于用户授权,OneDrive 服务将检查该文件是否存储在 Alice 的驱动器中。 如果它存储在另一个用户的驱动器中,则 OneDrive 将拒绝 Alice 的请求,因为 Alice 无权读取其他用户的驱动器。
对于客户端应用授权,OneDrive 将检查是否为代表登录用户发出调用的客户端授予了 Files.Read 范围。 在本例中,登录用户为 Alice。 如果未将 Files.Read 授予 Alice 的应用,则 OneDrive 也会使请求失败。
| GET /drives/{id}/files/{id} | Alice 的已授予 Files.Read 范围的客户端应用 |
Alice 的未授予 Files.Read 范围的客户端应用 |
|---|---|---|
| 文档位于 Alice 的 OneDrive 中。 | 200 – 已授予访问权限。 | 403 - 未授权。 Alice(或她的管理员)不允许此客户端读取她的文件。 |
| 文档位于另一个用户的 OneDrive 中*。 | 403 - 未授权。 Alice 无权读取此文件。 即使为客户端授予了 Files.Read,也应拒绝它代表 Alice 执行操作。 |
403 - 未授权。 Alice 无权读取此文件,并且也不允许客户端读取她有权访问的文件。 |
为了演示委托授权,提供的示例已经过简化。 生产 OneDrive 服务支持其他许多访问方案,例如共享文件。