Blazor WASM调用受Azure AD保护的Azure Functions API遇AADSTS65001错误问询
Blazor WASM 调用AAD保护Azure Functions的实现与报错排查
实现步骤与代码示例
- 首先确认两个前置配置已完成:Blazor客户端的应用注册已配置目标API的委托权限、API侧的应用注册已暴露对应客户端可访问的作用域,两类应用分属不同子域名部署时无需调整应用注册的跨域设置。
- 调整Blazor WASM项目的认证服务注册逻辑,核心是指定需要获取令牌的目标API作用域,而非仅配置默认的Microsoft Graph作用域,示例配置如下:
// Blazor WASM 项目 Program.cs 核心配置 builder.Services.AddMsalAuthentication(options => { // 绑定客户端应用注册的AAD租户、客户端ID等基础配置 builder.Configuration.Bind("AzureAd", options.ProviderOptions.Authentication); // 追加目标API的访问作用域,格式为 api://<API应用注册客户端ID>/<暴露的作用域名> options.ProviderOptions.DefaultAccessTokenScopes.Add("api://你的API应用注册ID/配置的作用域名"); }); // 注册自动携带认证令牌的HttpClient,指向Azure Functions的部署域名 builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri("https://hypotheticalapi.azurewebsites.net/") });
- 调整Azure Functions端的CORS规则,允许Blazor客户端的部署域名(hypotheticalweb.azurewebsites.net)的跨域请求,必须勾选CORS配置中的“启用访问控制凭据”选项,否则带Authorization请求头的认证请求会被浏览器拦截。
- 业务组件中直接通过注入的HttpClient调用API,令牌获取、过期刷新的流程由MSAL自动处理,遇到认证缺失时直接触发登录跳转即可,示例调用逻辑:
@inject HttpClient Http @inject NavigationManager Nav // 调用受保护的Function接口 private async Task CallProtectedEndpoint() { try { var apiResult = await Http.GetFromJsonAsync<string>("api/你的函数路由"); // 处理接口返回结果 } catch (AccessTokenNotAvailableException authEx) { // 令牌无效或缺失时,自动跳转AAD认证页完成授权 authEx.RedirectToLogin(); } }
AADSTS65001报错与旧同意记录清除方案
- 该报错的核心触发原因是配置变更后,AAD侧残留了之前的用户同意缓存,即便删除了客户端的权限配置,旧的同意记录依然会阻止AAD重新弹出交互式授权页。
- 清除历史同意记录的可操作方案:
- 普通用户维度:在个人应用门户中找到对应Blazor客户端应用,选择移除应用访问权限,即可清除个人账户下的同意记录。
- 客户端配置维度:在MSAL的认证参数中添加强制授权提示,手动要求AAD重新弹出同意页,示例配置:
// 在AddMsalAuthentication的配置块中追加 options.ProviderOptions.AdditionalQueryParameters = new Dictionary<string, string> { {"prompt", "consent"} };- 管理员维度:若为企业租户环境,全局管理员可在企业应用管理面板中,针对对应Blazor客户端应用清除所有用户的历史同意记录,强制全量重新走授权流程。
- 跨域问题额外排查点:如果认证流程正常但依然报跨域错误,优先检查Azure Functions的CORS配置是否未开启凭据支持——带Authorization头的请求属于带凭据的跨域请求,默认CORS配置无法放行这类请求。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

