Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 正确保护每个用户的WebSocket_Asp.net_Websocket_Oauth 2.0 - Fatal编程技术网

Asp.net 正确保护每个用户的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

我已经在我的应用程序中实现了WebSocket,但目前我发现了一个潜在的安全漏洞

websocket旨在将特定用户帐户的数据发送到浏览器,但服务器需要知道用户的
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会话