Blazor WASM调用带[Authorize]的后端接口返回401问题排查
问题分析与解决方案
1. 后端JwtBearer认证缺失Audience配置
Azure AD颁发的JWT令牌包含aud(受众)声明,后端必须验证该声明确保令牌是颁发给自己的。你注释掉Audience配置会导致后端无法完成这一验证,直接拒绝请求。
- 恢复并配置
Audience,值为后端应用注册的应用ID URI(格式通常为api://{后端应用客户端ID}) - 示例代码:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://login.microsoftonline.com/{租户ID}"; options.Audience = "api://{后端应用客户端ID}"; // 必须配置,对应后端应用的ID URI });
2. 前端AccessToken作用域错误
你当前配置的默认作用域是https://graph.microsoft.com/User.Read,这个令牌的受众是微软Graph API,而非你的后端API,后端自然会判定令牌无效。
- 修改前端Msal配置,添加后端API的专属作用域(格式通常为
api://{后端应用客户端ID}/{自定义作用域名}) - 示例配置:
builder.Services.AddMsalAuthentication(options => { builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); options.ProviderOptions.DefaultAccessTokenScopes.Add("api://{后端应用客户端ID}/access_as_user"); // 替换为后端暴露的作用域 });
3. 前端获取AccessToken需指定后端作用域
在DummyClient类中获取令牌时,必须明确指定后端API的作用域,不能沿用默认的Graph API作用域:
- 示例代码:
var accessTokenResult = await _tokenAcquisition.GetAccessTokenForUserAsync(new[] { "api://{后端应用客户端ID}/access_as_user" }); if (accessTokenResult.TryGetToken(out var accessToken)) { requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.Value); }
4. 后端应用注册需完成API暴露与权限配置
- 在Azure门户的后端应用注册页面,进入暴露API菜单,添加一个自定义作用域(比如
access_as_user) - 在前端应用注册页面,进入API权限菜单,添加后端API的权限,并完成管理员同意操作
内容的提问来源于stack exchange,提问作者thibsc
相关产品推荐
相关产品推荐

