我试图实现以下目标: 让未经身份验证的用户导航到网页,其中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?