如何在 C# 中验证 Websocket 连接
Posted
技术标签:
【中文标题】如何在 C# 中验证 Websocket 连接【英文标题】:How to authenticate Websocket connections in C# 【发布时间】:2021-08-31 00:12:46 【问题描述】:我有一个 html 应用程序。
某些页面必须运行 websockets 才能连接到运行 Asp.Net 应用程序的服务器并通过 Websocket 发送/接收一些消息。
websockets 服务器工作正常。但是任何人都可以向服务器发送一些请求。我希望我的服务器受到保护并且只接收经过身份验证的请求。例如,从开发人员模式下的 javascript 中,我可以对 Websocket 服务器运行请求...
到目前为止,我只接受来自我的域的请求,如下所示,但这还不够:
var webSocketOptions = new WebSocketOptions()
KeepAliveInterval = TimeSpan.FromSeconds(120),
;
webSocketOptions.AllowedOrigins.Add("https://example.com");
webSocketOptions.AllowedOrigins.Add("https://www.example.com");
app.UseWebSockets(webSocketOptions);
有什么方法可以验证 Websocket 请求吗?或者例如只允许合法用户向 WS 服务器发送请求?
谢谢。
【问题讨论】:
在协议级别,Web 套接字以 http 请求开始,然后协商以保持连接打开并将其用作套接字。在创建 Web 套接字之前,您应该能够首先验证 http 请求标头。使用您自己的中间件先运行,或者通过复制实现并对其进行调整 (github.com/dotnet/aspnetcore/blob/main/src/Middleware/…) 嗯,进一步挖掘细节,你的代码看起来像这个示例吗? github.com/dotnet/aspnetcore/blob/… 所以你在某个地方打电话给.WebSockets.AcceptWebSocketAsync
?然后,您可以完全控制当时验证请求。
【参考方案1】:
我希望其他人可以提供更多信息 - 因为我对 WS(Web Sockets)不是很熟悉,但我会在这里做(第 3 位可能是你想要的):
在 WS 连接建立之前验证 - 不言自明,如果他们没有通过其他方法进行身份验证,则不要创建 WS 连接,但这并不总是选项;
使用带有验证的指定格式 - 假设套接字期待以下形式的消息:
“令牌”:“27e0127341dfaojo”, "消息": "Hello World!", “命令”:“发送消息”
如果不是该格式,则忽略它 - 一旦是,您就可以验证令牌。
-
使用 (Cookie Authentication) - 链接解释更多。
【讨论】:
以上是关于如何在 C# 中验证 Websocket 连接的主要内容,如果未能解决你的问题,请参考以下文章
C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接