Excel插件连接Azure SignalR失败问题求助
问题:Excel插件连接Azure SignalR遇到403禁止错误
此前在WPF应用中成功用ASP.NET Core SignalR客户端连接Azure SignalR,但Office插件中使用该客户端会抛出DisposeAsync未实现异常,因此改用Microsoft.AspNet.SignalR.Client程序集。调用connection.Start().Wait()时触发403错误。
客户端代码
var query = new Dictionary<string, string>(); query.Add("version", "1.0"); query.Add("Authorization", GenerateAccessToken()); query.Add("hub", _hubName); connection = new HubConnection(_endpoint, query); connection.Headers.Add("Authorization", "Bearer " + GenerateAccessToken()); hubProxy = connection.CreateHubProxy(_hubName); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; connection.Start().Wait();
错误信息
HttpClientException: StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Connection: keep-alive Strict-Transport-Security: max-age=15724800; includeSubDomains Date: Sun, 25 Jun 2023 18:47:53 GMT Content-Length: 146 Content-Type: text/html }
Fiddler请求对比
- WPF应用(正常返回200):
POST https://<me>.service.signalr.net/client/negotiate?hub=default&negotiateVersion=1 - Excel插件(返回403):
GET https://<me>.service.signalr.net/signalr/negotiate?clientProtocol=2.1&connectionData=%5B%7B%22Name%22:%22default%22%7D%5D&version=1.0&Authorization=(access_token.....)
核心疑问:无法修改端点路径(从signalr改为client)或请求方法,手动修改端点参数会抛出异常。
解决方案
1. 启用Azure SignalR服务的旧版协议兼容模式
Microsoft.AspNet.SignalR.Client属于旧版ASP.NET SignalR客户端,Azure SignalR默认适配新版ASP.NET Core SignalR,需开启兼容模式:
- 登录Azure门户,进入你的SignalR服务实例
- 进入设置 -> 功能页面,将兼容模式设置为ASP.NET SignalR
- 保存配置,等待生效
2. 调整客户端代码
旧版客户端会自动拼接/signalr/negotiate路径,开启兼容模式后服务端会处理该路径,同时修正认证传递方式:
// 初始化HubConnection时直接传入服务根端点,不需要手动拼接路径 connection = new HubConnection("https://<me>.service.signalr.net"); // 仅在Headers中传递Bearer令牌,避免在Query中重复传递 connection.Headers.Add("Authorization", "Bearer " + GenerateAccessToken()); hubProxy = connection.CreateHubProxy(_hubName); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; connection.Start().Wait();
3. 验证令牌权限
确保生成的access_token具备访问Azure SignalR服务的权限:
- 令牌需包含正确的scope(如
https://signalr.azure.com/.default) - 检查Azure RBAC配置,确保令牌对应的身份有SignalR服务的访问权限
内容的提问来源于stack exchange,提问作者Stig
相关产品推荐
相关产品推荐

