Session 在ASP.NET Core中识别未经身份验证的用户/pc

Session 在ASP.NET Core中识别未经身份验证的用户/pc,session,asp.net-core,session-cookies,asp.net-core-signalr,Session,Asp.net Core,Session Cookies,Asp.net Core Signalr,我正在努力实现以下目标: 让未经身份验证的用户导航到一个网页,其中一个信号器(核心)客户端将连接到一个中心(比如通知中心)。 让用户执行一个操作,当操作在服务器上完成时,使用SignalR通知用户操作完成。 问题:当用户登录时,我通过保存在内存中的connectionId用户名映射找到他的SignalR connectionId。那么我会: hub.SendConnectionAsync(connectionId, "Message", data); 如果用户没有经过身份验证,我会使用Sess

我正在努力实现以下目标: 让未经身份验证的用户导航到一个网页,其中一个信号器(核心)客户端将连接到一个中心(比如通知中心)。 让用户执行一个操作,当操作在服务器上完成时,使用SignalR通知用户操作完成。 问题:当用户登录时,我通过保存在内存中的connectionId用户名映射找到他的SignalR connectionId。那么我会:

hub.SendConnectionAsync(connectionId, "Message", data);
如果用户没有经过身份验证,我会使用SessionId,而我保存在内存中的映射会给我一个ConnectionId和一个SessionId。我在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是空字符串,它看起来像是在iframe中打开的我的页面的cookie(其中是会话cookie)没有添加到由在iframe中执行的javascript代码执行的http请求中


更一般地说,如果用户未经身份验证,您如何识别他?HttpRequest中是否有可以用作唯一id的内容,如机器名或ip?

否。请求头中几乎没有关于客户端的信息,只有当客户端选择发送这些头时,以及客户端对这些头是否诚实时(客户端可以发送它喜欢的任何内容)。识别用户/设备的唯一方法是:1)身份验证和2)cookie。但是,在后一种情况下,客户端可以选择不发送cookie、禁用cookie等。换句话说,如果您需要确保您与特定用户一起工作,唯一的傻瓜式方法是身份验证。我仍在调查,但cookie在iFrame中不可用的部分似乎不正确。因此,我使用会话Id来标识客户端。当然这不是一个理想的方法,但我不知道如何做,否则。Auth。使用auth。你可以用很轻的重量来处理它。举例来说,这并不意味着你必须经历一个完整的注册过程。在最简单的形式中,它可以简单地分配一个令牌,并让所有未来的请求将该令牌发送回。