Microsoft.Identity.Web中AddMicrosoftGraph注入的GraphServiceClient认证异常
问题根因
你遇到的错误核心是注入的GraphServiceClient读取配置的作用域时格式不匹配,导致发起OBO流请求Graph令牌时没有携带正确的User.Read作用域。你手动调用GetAccessTokenForUserAsync时明确传入了作用域数组,所以可以正常运行。
修复步骤
- 修正服务端
appsettings.json的Graph配置,将Scopes字段改为数组格式,避免配置绑定错误:
"GraphAPI": { "BaseUrl": "https://graph.microsoft.com/v1.0", "Scopes": ["User.Read"] }
- 给调用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); } }
- 可选兜底配置:如果担心配置绑定异常,可以在服务端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
相关产品推荐
相关产品推荐

