Blazor WASM通过MSAL调用Azure Function下游API权限问题排查
排查Blazor WASM调用Azure Function权限错误的步骤
1. 核对Azure Function的Easy Auth核心配置
- 确认Function的身份验证/授权设置里,已启用「应用服务身份验证」,且「未验证请求的处理方式」设为「使用Azure Active Directory登录」,避免选「允许匿名」或「返回401」导致权限逻辑冲突。
- 检查Azure AD提供商配置:确保绑定的是为Function创建的应用注册,客户端ID、租户ID完全匹配,「颁发者URL」格式正确(示例:
https://login.microsoftonline.com/{租户ID}/v2.0)。
2. 确认API权限的授予状态
- 进入Web应用的应用注册「API权限」页面:
- 已添加Function应用注册暴露的委派权限(Blazor WASM属于前端应用,需用用户身份调用API)。
- 该权限已完成管理员同意授予(即使是租户内用户,部分场景也需此步骤生效)。
3. 解析AccessToken验证关键声明
- 在Blazor WASM中添加调试代码,用
System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler解析获取到的AccessToken:- 检查
aud(受众)声明是否完全匹配Function应用注册的应用ID URI(示例:api://{Function应用注册客户端ID}),注意大小写、末尾字符是否一致。 - 检查
scp(范围)声明是否包含Function暴露的权限范围(示例:api://xxx/HelloWorld.Read),缺失则说明权限请求或授予环节出错。 - 确认Token未过期,
exp时间戳在当前时间之后。
- 检查
4. 检查Function的授权级别与代码逻辑
- 确认Function的
FunctionName属性中,授权级别设为AuthorizationLevel.Anonymous——因为Easy Auth已接管身份验证,若设为Function或Admin会触发双重验证,导致权限错误。 - 检查Function代码内的自定义权限验证逻辑(如角色、声明检查),确保Token中存在对应声明且符合要求。
5. 验证请求头的Token传递正确性
- 确认
APIAuthMessageHandler已将AccessToken正确加入请求的Authorization头,格式为Bearer {AccessToken},注意Bearer后需加空格,Token需完整无截断。 - 用浏览器开发者工具或抓包工具捕获请求,检查
Authorization头是否存在、格式正确,同时确认请求URL为Function的正确路径(示例:https://{function-app-name}.azurewebsites.net/api/HelloWorld,不可遗漏/api前缀)。
6. 核对Function应用注册的API暴露设置
- 进入Function的应用注册「公开API」页面:
- 应用ID URI配置正确,已添加的权限范围(如
HelloWorld)的「谁能同意?」设置符合场景(「组织内用户」或「任何人」),若设为「仅管理员」但未完成管理员同意,会导致用户无法获取对应权限的Token。 - Web应用的应用注册已被添加为「已授权的客户端应用」,且勾选了对应权限范围。
- 应用ID URI配置正确,已添加的权限范围(如
内容的提问来源于stack exchange,提问作者Jason_Hough
相关产品推荐
相关产品推荐

