我正在做一个实现SignalR的.NET 5项目,用于Angular 11前端,具有OAuth2身份验证。该应用程序托管在Kubernetes上,因此我需要使用skipNegotiation: true和transport: HttpTransportType.WebSockets来强制在负载均衡器后面的单个服务器上建立连接。这将强制SignalR库将我的访问令牌作为查询字符串参数发送。在实现后,我得到了一个404响应,我花了很长时间才弄清楚原因:我的访问令牌太长了。如果我发送随机字符作为访问令牌,长度不超过2035个字符,它就可以工作(当然,它显然无法通过身份验证,但这是意料之中的)。如果我发送长度约为2500个字符的完整访问令牌,它将返回404响应。
我相信我的实现是相当典型的,因为到目前为止它只是遵循示例代码:
Startup.cs:
// In ConfigureServices()
services.AddSignalR();
//In Configure()
app.UseEndpoints(endpoints => {
endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
endpoints.MapHub<MessageHub>("/message-hub");
});MessageHub.cs:
public class MessageHub : Hub {
public async Task EchoTest(string message) => await Clients.All.SendAsync("echo", message);
public override Task OnConnectedAsync() {
Debug.WriteLine("connected");
return base.OnConnectedAsync();
}
}客户端:
const connection = new HubConnectionBuilder()
.withUrl('http://localhost:5001/message-hub', {
skipNegotiation: true,
transport: HttpTransportType.WebSockets,
accessTokenFactory: () => {
return 'MY_ACCESS_TOKEN'; // If 2036 characters or greater, 404 responses ensue
}
})
.build()
.start()
.then(() => console.log('Connection started'))
.catch(err => console.log('Error while starting connection: ' + err))对我来说,通过对声明标识符等进行大量重构来减少访问令牌的长度是可行的,但这是最后的手段。理想情况下,我想要的是一种将我当前的大型访问令牌按原样提供给SignalR而又不破坏它的方法。如有任何建议,我们将不胜感激。
发布于 2021-11-04 23:55:22
抛出404的东西是IIS请求过滤。下面的web.config为我们解决了这个问题
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxQueryString="5000"></requestLimits>
</requestFiltering>
</security>
</system.webServer>
</configuration>https://stackoverflow.com/questions/66307330
复制相似问题