You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用MS Graph API自助重置密码遇Authorization_RequestDenied错误求助

解决MS Graph API调用ChangePassword时的Authorization_RequestDenied错误

错误原因

你当前代码使用客户端凭证流(AcquireTokenForClient)获取应用级别的access token,但ChangePassword属于用户自助操作API,要求必须在用户上下文下调用(即使用用户的委托权限token),应用权限无法执行该操作,因此返回权限拒绝错误。

正确实现方案

1. 权限配置

在Azure AD应用注册中添加委托权限:Directory.AccessAsUser.All,并完成管理员同意或用户同意(根据租户配置)。

2. 使用用户上下文Token调用API

因为是已登录用户的自助操作,需使用用户登录后获取的access token(而非应用Token)调用Graph API。此时可通过/me端点指代当前登录用户,无需硬编码用户ID。

修改后的代码示例

假设Web应用已通过授权码流获取到用户的access token并存储在会话中,实现如下:

private static async Task UpdateUserPassword(string userAccessToken, string oldPassword, string newPassword)
{
    try
    {
        GraphServiceClient graphServiceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(async (requestMessage) =>
            {
                // 传入已登录用户的access token
                requestMessage.Headers.Authorization =
                    new AuthenticationHeaderValue("Bearer", userAccessToken);
            })
        );

        // 用/me端点操作当前登录用户
        await graphServiceClient.Me
            .ChangePassword(oldPassword, newPassword)
            .Request()
            .PostAsync();
    }
    catch (Exception ex)
    {
        // 处理异常,比如旧密码错误、新密码不符合策略等
        throw ex;
    }
}

关键说明

  • 客户端凭证流适用于应用自身操作资源的场景(如批量用户同步),但用户自助改密码属于用户自身操作,必须用用户上下文Token。
  • /me端点仅在用户已登录、Token包含用户身份信息时有效,会自动映射到当前Token对应的用户,无需手动指定用户ID。
  • oldPassword和newPassword必须是当前登录用户输入的内容,ChangePassword API会验证旧密码的正确性。

内容的提问来源于stack exchange,提问作者Sachin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 08:00:57