Asp.net 正确保护每个用户的WebSocket
我已经在我的应用程序中实现了WebSocket,但目前我发现了一个潜在的安全漏洞 websocket旨在将特定用户帐户的数据发送到浏览器,但服务器需要知道用户的Asp.net 正确保护每个用户的WebSocket,asp.net,websocket,oauth-2.0,Asp.net,Websocket,Oauth 2.0,我已经在我的应用程序中实现了WebSocket,但目前我发现了一个潜在的安全漏洞 websocket旨在将特定用户帐户的数据发送到浏览器,但服务器需要知道用户的AccountID。目前,我只是将AccountId作为查询字符串参数从前端发送,但这显然会被滥用,因为任何人都可以人为更改其AccountId 我目前在ASP.NET后端使用ApplicationAuthProvider进行WebAPI身份验证,但我无法将其用于WebSocket请求,因为当我设置承载令牌失败时。因此,我不得不将我的We
AccountID
。目前,我只是将AccountId
作为查询字符串参数从前端发送,但这显然会被滥用,因为任何人都可以人为更改其AccountId
我目前在ASP.NET后端使用ApplicationAuthProvider
进行WebAPI身份验证,但我无法将其用于WebSocket请求,因为当我设置承载令牌失败时。因此,我不得不将我的WebSocket握手呼叫设置为匿名
控制器
[AllowAnonymous]
[HttpGet]
[Route("api/realtime")]
public async Task<HttpResponseMessage> RealTime()
{
var currentContext = HttpContext.Current;
if (currentContext.IsWebSocketRequest || currentContext.IsWebSocketRequestUpgrading)
{
currentContext.AcceptWebSocketRequest(this.ProcessWebSocketRequest);
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
}
return Request.CreateResponse(HttpStatusCode.BadRequest);
}
public override void OnOpen()
{
this.AccountId = int.Parse(this.WebSocketContext.QueryString["accountId"]);
if (this.myClientService.ClusterClient == null)
{
this.myClientService
.Start()
.ContinueWith(async (t) =>
{
await this.myClient.OnWebSocketConnected(this.AccountId, this);
});
}
else
{
var unawaitedTask = this.myClient.OnWebSocketConnected(this.AccountId, this);
}
}
这通常是如何解决的?您可以为此使用一次性令牌,如下所示: 首先,客户端使用身份验证头中的承载令牌进行HTTP调用,作为授权或身份验证的手段。作为响应,应用程序返回用于建立websocket连接的URL。此URL可能看起来像“wss://domain.name/connect/374623618723232372". 该长随机数是一个一次性令牌,您可以根据需要生成并存储在数据库中,将其与授权或身份验证上下文关联(例如,它可以是用户ID,也可以是授予用户的任何角色或权限) 接下来,客户端使用该URL与应用程序建立websocket连接。发生这种情况时,应用程序将从URL中提取一次性令牌,在数据库中验证该令牌是否尚未使用,读取授权/身份验证上下文,然后将其从数据库中删除 通过这种方式,您可以将websocket会话唯一地链接到OAuth会话