Domanda: Come gestisco gli utenti anonimi in modo che più schede in un singolo browser vengano tutte aggiornate quando l'hub invia una risposta?SignalR C# MVC Mapping utente anonimo a ID cliente
Lo scenario è il seguente:
Vorrei integrare SignalR in un progetto in modo che gli utenti anonimi possono live chat con gli operatori. Ovviamente gli utenti che si sono autenticati con iIdentity vengono mappati tramite il comando Client.User (username). Al momento, tuttavia, un utente anonimo sta navigando su site.com/tools e site.com/notTools Non riesco a inviare messaggi a tutte le schede con un solo ID di connessione. Solo una scheda raccoglie la risposta.
Ho provato a utilizzare la patch IWC ma quello strumento non tiene conto del salvataggio delle informazioni della chat in un database e penso che passare le variabili via ajax non sia un modo sicuro di leggere/scrivere su un database.
Ho anche guardato il seguente: Managing SignalR connections for Anonymous user
Tuttavia la creazione di una base come quella e l'utilizzo di sessioni sembra meno sicuro di Owin.
Ho avuto l'idea di utilizzare client.user() creando un account falso ogni volta che un utente si connette ed elimina quando si disconnettono. Ma preferirei non riempire il mio contesto di db aspnetusers con account spazzatura che sembra non necessario.
È possibile utilizzare UserHandler.ConnectedIds.Add(Context.ConnectionId);
anche per mappare un nome utente falso? Sono in perdita.
Avrebbe senso utilizzare il provider iUserId?
public interface IUserIdProvider
{
string GetUserId(IRequest request);
}
Quindi creare un database che memorizza gli indirizzi IP in ID di connessione e singoli nomi utente?
database:
Utenti: Con FK agli ID di collegamento
|userid|username|IP |connectionIDs|
| 1 | user1 |127.0.0.1| 1 |
| 2 | user2 |127.0.0.2| 2 |
connectionIDs:
|connectionID|SignalRID|connectionIDs|
| 1 | xx.x.x.x| 1 |
| 2 | xx.xxx.x| 2 |
| 3 | xx.xxxxx| 2 |
| 4 | xxxxx.xx| 2 |
poi eventualmente scrivere la logica di tutto il collegamento?
public override Task OnConnected()
{
if(Context.Identity.UserName != null){
//add a connection based on the currently logged in user.
}
else{
///save new user to database?
}
}
ma la domanda ancora rimane come avrei gestire più schede con che quando si invia un comando sul websocket?
aggiornamento Per essere chiari, il mio intento è quello di creare uno strumento di chat/supporto live che permette di browser l'accesso anonimo a tutti i tempi.
il cliente vuole qualcosa di simile a http://www.livechatinc.com
ho già creato un plugin JavaScript che invia e riceve dal mozzo, indipendentemente da quale dominio si trova. (il mio cliente ha multisiti) il pezzo mancante del puzzle è il più semplice, gestendo gli utenti anonimi per consentire conversazioni multi-tab.
Cosa vuoi è un utente anonimo di essere in grado di chattare allo stesso sito (es. site.com) da qualsiasi scheda aperta del browser, giusto? – tede24
@ tede24 sì è quello che vorrei. – Chris
Non puoi semplicemente impostare un cookie con qualche tipo di SessionId (Guid), creare un gruppo per quell'Id e sottoscrivere tutte le connessioni lì? In questo modo potresti avere messaggi trasmessi a tutte le schede – tede24