WebSocket身份验证
约 229 字小于 1 分钟
2025-02-12
服务器端
尽管 JavaScript 无法为 websocket 连接添加请求头,但是可以通过设置其子协议属性来间接地赋值于 Sec-WebSocket-Protocol 请求头。
这就意味着我们能够在服务器端验证 token,只需设置 Sec-WebSocket-Protocol 头即可实现。
添加验证中间件时,设置多个请求头来验证:
//把 Authorization、Sec-WebSocket-Protocol 这两个请求头的值拿去做身份验证
services.AddMirageTokenAuthentication(new NetAddress("127.0.0.1", 9911) , new string[] { "Authorization", "Sec-WebSocket-Protocol" } );然后,websocket 的 controller 添加 Mirage.Authorize 特性即可。
[Mirage.Authorize]
public class DemoWebSocketAuthController : Mirage.WebSocketController
{
public override async Task OnConnected(WebSocket webSocket)
{
var claimsPrincipal = (ClaimsPrincipal)this.UserContent;
var userName = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
while (true)
{
await Task.Delay(2000);
await webSocket.SendString($"hi,{userName} ,现在时间是:{DateTime.Now}");
}
}
}客户端 JavaScript
<script>
var token = "WyJ7XCJkX.CI6XCJqYWNrXCIsXCJlXCI6MTY4MTUzOTA4OX0iLCI5NkM4OUQ3NjA1QjY5QjYxNTdBOUY4/RkYwQzg0ODNBMyJd=";
token = token.replace(/\//g,"-").replace(/=/g,"_");//替换一些websocket不认的字符
var websocket = new WebSocket("ws://127.0.0.1:8912/AuthTestService" , token);
websocket.onopen = function () {
}
websocket.onmessage = function (e) {
console.log(e.data);
}
</script>