启用Azure AD认证后HubConnection.StartAsync()报403 Forbidden错误
Blazor聊天应用Azure AD认证后SignalR连接失败问题
我用Blazor和C#开发了一款聊天应用,实现思路参考了相关教程。部署到Azure App Service后原本运行正常,但启用以Microsoft为身份提供商的Azure AD认证(已完成应用注册配置)后,出现连接错误,错误详情可查看浏览器开发者工具截图。
以下是启动HubConnection的代码:
hubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/chatservice")).Build(); hubConnection.On<string, string>("ReceiveMessage", (user, message) => { userMessages.Add(new UserMessage { Username = user, Message = message, isCurrentUser = user == usernameInput, DateSent = DateTime.Now }); this.InvokeAsync(() => this.StateHasChanged()); }); await hubConnection.StartAsync();
错误发生在最后一行代码await hubConnection.StartAsync();,提示信息为:无法关闭认证
问题修复方案
核心原因:启用Azure AD认证后,SignalR Hub连接需要携带用户的认证令牌,但当前代码未配置令牌传递逻辑,导致请求被认证拦截。
具体修复步骤:
- 修改HubConnection配置,添加令牌获取逻辑:
在WithUrl方法中配置AccessTokenProvider,自动获取当前用户的Azure AD令牌并附加到SignalR请求:hubConnection = new HubConnectionBuilder() .WithUrl(NavigationManager.ToAbsoluteUri("/chatservice"), options => { options.AccessTokenProvider = async () => { var tokenResult = await AccessTokenProvider.RequestAccessToken(); tokenResult.TryGetToken(out var token); return token?.Value ?? string.Empty; }; }) .Build(); - 注入IAccessTokenProvider服务:
在组件顶部添加依赖注入,确保能获取用户令牌:[Inject] public IAccessTokenProvider AccessTokenProvider { get; set; } - 验证Azure端配置:
- 检查Azure App Service的CORS设置,确保允许SignalR的跨域请求(针对Blazor WASM应用);
- 在Azure AD应用注册中,确认已添加正确的API权限(如
access_as_user类型的权限); - 确保SignalR Hub类上添加了
[Authorize]特性,后端能正确验证Azure AD令牌。
- 修改HubConnection配置,添加令牌获取逻辑:
内容的提问来源于stack exchange,提问作者Fabian Holz
相关产品推荐
相关产品推荐

