You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用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连接需要携带用户的认证令牌,但当前代码未配置令牌传递逻辑,导致请求被认证拦截。

  • 具体修复步骤:

    1. 修改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();
      
    2. 注入IAccessTokenProvider服务:
      在组件顶部添加依赖注入,确保能获取用户令牌:
      [Inject]
      public IAccessTokenProvider AccessTokenProvider { get; set; }
      
    3. 验证Azure端配置:
      • 检查Azure App Service的CORS设置,确保允许SignalR的跨域请求(针对Blazor WASM应用);
      • 在Azure AD应用注册中,确认已添加正确的API权限(如access_as_user类型的权限);
      • 确保SignalR Hub类上添加了[Authorize]特性,后端能正确验证Azure AD令牌。

内容的提问来源于stack exchange,提问作者Fabian Holz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:22:12