如何在 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 连接的主要内容,如果未能解决你的问题,请参考以下文章

验证 WebSocket 连接

C# socket 如何断开连接

C# HttpListener Prefixes 不接受 `ws` 阻止 JS WebSocket 连接

如何使用 C# 和 ASP.Net Core 2.2 连接和收听外部 websocket url

C# & JS WebSocket 部分用户无法连接服务器

如何在 C# Asp.net MVC 中创建 websocket 客户端?