Microsoft Graph应用权限被识别为委派权限,无法代其他用户发邮件
问题解答
核心结论
- 通过用户交互流程生成的访问令牌仅适用于委派(Delegated)权限,无法使用应用(Application)权限。要实现以任意指定用户身份发送邮件,必须使用守护程序专属的客户端凭证流获取应用权限令牌。
具体问题分析与解决步骤
权限配置问题排查
你提到配置了Mail.Send+offline_access作为Application权限,但Entra管理中心显示为Delegated权限,这说明权限配置环节有误:- 应用注册的API权限分为「委派权限」和「应用权限」两类,需确保是在「应用权限」下添加的
Mail.Send(注意:offline_access只有委派权限版本,应用权限不需要这个权限)。 - 管理员同意时,要选择对应「应用权限」的「授予管理员同意」操作,而非委派权限的同意。
- 应用注册的API权限分为「委派权限」和「应用权限」两类,需确保是在「应用权限」下添加的
令牌类型与权限的对应关系
- 从用户视角生成的令牌(比如授权码流、密码流获取的令牌)属于委派令牌,令牌中包含用户身份信息,仅能以该用户的身份执行操作,所以你只能用它给自己发邮件,替其他用户发送就会触发Forbidden错误。
- 应用权限对应的是客户端凭证令牌,这类令牌由应用本身的身份(客户端ID+密钥/证书)获取,不关联具体用户,只要已授予应用级别的
Mail.Send权限,就能以任意指定用户身份发送邮件。
守护程序服务的令牌获取流程
使用客户端凭证流获取令牌,流程如下:- 确保应用已添加
Mail.Send应用权限,并完成组织范围的管理员同意。 - 使用应用的客户端ID、客户端密钥(或证书),向Microsoft身份平台的令牌端点发送请求:
POST https://login.microsoftonline.com/{租户ID}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded grant_type=client_credentials &client_id={你的客户端ID} &client_secret={你的客户端密钥} &scope=https://graph.microsoft.com/.default - 获取到令牌后,调用Graph API发送邮件时,在请求中指定目标用户的邮箱或ID即可:
POST https://graph.microsoft.com/v1.0/users/{目标用户ID}/sendMail Authorization: Bearer {应用权限令牌} Content-Type: application/json { "message": { "subject": "测试邮件", "body": { "contentType": "Text", "content": "这是通过应用权限发送的测试邮件" }, "toRecipients": [ { "emailAddress": { "address": "收件人邮箱" } } ] }, "saveToSentItems": "false" }
- 确保应用已添加
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

