如何在用户上下文下调用MS Graph API实现用户密码修改
授权问题解决方案
你遇到的无用户同意界面的场景可以通过租户管理员预授权解决:
- 进入注册的AAD应用的「API权限」配置页,找到已添加的Delegated类型
UserAuthenticationMethod.ReadWrite.All权限,点击「授予管理员同意」,完成后该权限对租户内所有用户生效,后续调用无需再弹出用户同意界面。 - 如果你的场景是管理员代用户重置密码(无需用户提供旧密码),可以直接申请Application类型的
UserAuthenticationMethod.ReadWrite.All权限,同样授予管理员同意后,服务端可以直接调用接口操作所有用户的密码,不需要获取用户身份的委托令牌。
代码调整方案
你现有的调用代码本身没有问题,只需要调整SimpleAuthProvider的实现和令牌获取逻辑即可:
- 委托权限场景(用户自己改密码,需验证旧密码)
- 先通过授权码流获取对应用户的访问令牌,令牌中需要包含
UserAuthenticationMethod.ReadWrite.All的权限声明 SimpleAuthProvider仅需要在每个Graph请求的Header中添加Authorization: Bearer {有效访问令牌}即可- 注意:请求中的
myUserId必须和访问令牌对应的用户ID完全一致,否则会触发权限报错
- 先通过授权码流获取对应用户的访问令牌,令牌中需要包含
- 应用权限场景(管理员代重置密码,无需旧密码)
- 用客户端凭据流获取AAD应用的访问令牌,调用密码重置接口即可,示例代码如下:
var client = new GraphServiceClient(new SimpleAuthProvider(appAccessToken)); await client.Users[myUserId] .Authentication // 固定ID对应密码类型的认证方法 .Methods["28c10230-6103-485e-b985-444c60001490"] .ResetPassword(newPassword, false) .Request() .PostAsync();
额外注意事项
- 访问令牌默认有效期为1小时,需要实现令牌自动刷新逻辑,不要硬编码固定令牌
- 若使用B2C租户,需要确保AAD应用的受众配置包含你的B2C租户域名,否则令牌会被Graph API拒绝
内容的提问来源于stack exchange,提问作者Zsolt
相关产品推荐
相关产品推荐

