Blazor Wasm应用访问Graph及自定义下游API授权切换问题
解决Blazor WASM同时访问Graph与自定义API的授权切换问题
核心问题本质
你遇到的问题是没有针对不同下游API请求对应专属令牌,默认复用了Graph的令牌,但自定义API只认可自身受众(Audience)的令牌,因此触发无效签名错误。
具体解决步骤
1. 确认客户端应用注册配置
- 检查自定义API的应用ID URI已添加到客户端应用的API权限列表中,且已完成管理员同意(应用权限场景)或用户同意(委托权限场景)。
- 确保Graph权限和自定义API权限都已正确配置并生效。
2. 为不同API编写独立的令牌获取逻辑
Blazor WASM中使用IAccessTokenProvider获取令牌时,必须指定目标API的范围或受众,不能复用默认配置:
获取Graph令牌代码
var graphTokenResult = await _accessTokenProvider.RequestAccessToken( new AccessTokenRequestOptions { Scopes = new[] { "https://graph.microsoft.com/User.Read" } // 替换为你需要的Graph具体权限 }); if (graphTokenResult.TryGetToken(out var graphToken)) { // 使用graphToken调用Graph API }
获取自定义API令牌代码
var customApiTokenResult = await _accessTokenProvider.RequestAccessToken( new AccessTokenRequestOptions { // 替换为你的自定义API应用ID和权限范围 Scopes = new[] { "api://<自定义API应用ID>/<自定义权限范围>" } // 也可直接指定受众: // Audience = "api://<自定义API应用ID>" }); if (customApiTokenResult.TryGetToken(out var customApiToken)) { // 将令牌加入请求头,调用自定义API httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", customApiToken.Value); var response = await httpClient.GetAsync("api/your-endpoint"); }
3. 为自定义API配置专属HttpClient(推荐)
为避免令牌混用,建议通过IHttpClientFactory创建专属HttpClient,自动注入对应令牌:
// Program.cs中注册 builder.Services.AddHttpClient("CustomApiClient", client => { client.BaseAddress = new Uri("https://你的自定义API地址/"); }) .AddHttpMessageHandler(sp => { var handler = sp.GetRequiredService<AuthorizationMessageHandler>() .ConfigureHandler( authorizedUrls: new[] { "https://你的自定义API地址/" }, scopes: new[] { "api://<自定义API应用ID>/<自定义权限范围>" }); return handler; });
组件中注入并使用:
private readonly HttpClient _customApiClient; public YourComponent(IHttpClientFactory httpClientFactory) { _customApiClient = httpClientFactory.CreateClient("CustomApiClient"); } // 直接调用,HttpClient会自动携带正确的自定义API令牌 var response = await _customApiClient.GetAsync("api/your-endpoint");
4. 验证令牌有效性
用JWT解码工具检查令牌的aud(受众)字段:自定义API的令牌受众必须是自身的应用ID URI,而非Graph的https://graph.microsoft.com。如果不符,检查请求令牌时的Scope或Audience配置是否正确。
常见排查点
- 自定义API的应用注册中,应用ID URI是否正确设置,且与客户端请求的Scope/Audience完全一致。
- 客户端应用是否已成功获取自定义API的权限(在Azure AD应用注册的API权限列表中确认状态)。
- 调用自定义API时,是否不小心复用了Graph的HttpClient实例或令牌。
内容的提问来源于stack exchange,提问作者Mauricio Atanache
相关产品推荐
相关产品推荐

