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

Microsoft.Identity.Web中AddMicrosoftGraph注入的GraphServiceClient认证异常

问题根因

你遇到的错误核心是注入的GraphServiceClient读取配置的作用域时格式不匹配,导致发起OBO流请求Graph令牌时没有携带正确的User.Read作用域。你手动调用GetAccessTokenForUserAsync时明确传入了作用域数组,所以可以正常运行。

修复步骤
  1. 修正服务端appsettings.json的Graph配置,将Scopes字段改为数组格式,避免配置绑定错误:
"GraphAPI": {
  "BaseUrl": "https://graph.microsoft.com/v1.0",
  "Scopes": ["User.Read"]
}
  1. 给调用Graph的服务端控制器/接口添加[AuthorizeForScopes]属性,自动处理OBO流的增量同意逻辑,将权限不足的异常转换为前端可识别的认证挑战:
[Authorize]
[ApiController]
[Route("api/[controller]")]
// 此处指定Graph需要的作用域
[AuthorizeForScopes(Scopes = new[] { "User.Read" })]
public class MyController : ControllerBase
{
    private readonly GraphServiceClient _graphClient;

    // 直接注入即可正常使用
    public MyController(GraphServiceClient graphClient)
    {
        _graphClient = graphClient;
    }

    [HttpGet("me")]
    public async Task<IActionResult> GetCurrentUser()
    {
        var me = await _graphClient.Me.Request().GetAsync();
        return Ok(me);
    }
}
  1. 可选兜底配置:如果担心配置绑定异常,可以在服务端Startup注册时直接指定Graph作用域:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
    // 直接明确指定作用域,跳过配置读取
    .AddMicrosoftGraph(options =>
    {
        options.BaseUrl = "https://graph.microsoft.com/v1.0";
        options.Scopes = new[] { "User.Read" };
    })
    .AddInMemoryTokenCaches();
额外检查项

确认Azure门户中Web API对应的应用注册已添加Microsoft Graph的委托权限User.Read,由于你使用的是consumers租户(个人微软账号),不需要管理员同意,用户首次登录时会自动触发权限同意弹窗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:36:04