在ASP.NET Core

时间:2018-06-18 12:20:53

标签: session asp.net-core session-cookies asp.net-core-signalr

我试图实现以下目标: 让未经身份验证的用户导航到网页,其中SignalR(核心)客户端将连接到集线器(例如通知中心)。 让用户执行操作,并在服务器上完成操作时,使用SignalR通知他完成操作。 问题:当用户登录时,我通过保存在内存中的connectionId-username映射找到他的SignalR connectionId。然后我做:

hub.SendConnectionAsync(connectionId, "Message", data);

如果用户未经过身份验证,我想出了使用SessionId,我保存在内存中的地图给了我一个给出SessionId的ConnectionId。我在HubLifetimeManager上使用的代码片段如下:

public override async Task OnConnectedAsync(HubConnectionContext connection)
    {
        await _wrappedHubLifetimeManager.OnConnectedAsync(connection);
        _connections.Add(connection);
        string userId;
        if (connection.User.Identity.IsAuthenticated)
        {
            userId = connection.User.Identity.Name;
        }
        else
        {
            var httpContext = connection.GetHttpContext();
            if (httpContext == null)
            {
                throw new Exception("HttpContext can't be null in a SignalR Hub!!");
            }
            var sessionId = httpContext.Session.Id;
            userId = $"{Constants.AnonymousUserIdentifierPrefix}{sessionId}";
        }
        await _userTracker.AddUser(connection, new UserDetails(connection.ConnectionId, userId));
    }

问题:如果我的页面在iframe中打开,httpContext.Session.Id是空字符串,看起来我的页面的cookie在iframe中打开(其中包括Session cookie),不会添加到由iframe内执行的javascript代码执行的http请求...

更一般地说,如果用户未经过身份验证,您如何识别用户? HttpRequest中有什么东西可以用作唯一的id,比如机器名或ip?

0 个答案:

没有答案