Der anonyme SignalR User

Die Aufgabe einen Webchat in bestehende Website einbauen. Da ein IIS (und Webforms) dahinter stehen. Mittel der Wahl SignalR als Abstraktion einer Websocket Connection. Diese braucht man um einen Server Pusch zu realisieren. Warnung Code ist VB.

Ich gehe hier nicht auf die technischen Details zu SignalR ein, sondern nur auf ein Problem. In einer klassischen Website wird man nicht mit angemeldeten Benutzern arbeiten. In der Regel sind diese Anonym. Nun arbeitet SignalR im Hintergrund mit dem User.Identity.Name der dann eben leer ist. In diesem Fall wird eine Connection ID erzeugt und genutzt. Diese kann man im SignalR Hub auch abfragen

   1:  Public Overrides Function OnConnected() As Task
   2:  Dim x = Context.ConnectionId

Wenn dann der Client benachrichtigt werden soll und dort defacto eine JavaScript Methode aufgerufen wird, lässt sich das einfach aus dem Hub per Caller erledigen ohne die ID zu kennen oder zu nutzen.

   1:  Clients.Caller.JavaScriptMethode(Parameter)

Problem: was ist wenn der Benutzer den Browser schließt oder auf unterschiedlichen Geräten gleichzeitig am Chat teilnehmen will. Dann braucht es einen dauerhaften User. Das kann man noch immer mit einem Cookie im Browser erledigen. Nennen wir ihn Username und weisen die Email Adresse als Key zu.

Das Problem wie kann ein Username aus Querystring, Cookie oder auch Session für eine SignalR Verbindung genutzt werden, lässt sich mit einem Provider lösen. Diesen als Klasse anlegen und mit vb.net Logik füllen.

   1:  Public Class EmailBasedUserIDProvider
   2:      Implements IUserIdProvider
   3:      Public Function GetUserId(request As IRequest) 
As String Implements IUserIdProvider.GetUserId
   4:          Dim u = request.User
   5:          If request.Cookies.ContainsKey("Username") Then
   6:              Return request.Cookies("Username").Value
   7:          Else
   8:              Return "anonym"
   9:          End If
  10:      End Function
  11:  End Class

 

Den Provider muss man noch anmelden. Im klassischen .NET Framework in der Startup.vb oder Startup.auth.vb. kann auch anders benannt sein die Owin Startup Datei. In ASP.NET Core 5 funktioniert es ganz ähnlich per Program.cs bzw. Startup.cs (oder vb).

   1:  app.MapSignalR()
   2:  Dim idProvider = New EmailBasedUserIDProvider()
   3:  GlobalHost.DependencyResolver.Register
(GetType(IUserIdProvider), Function() idProvider)

Zeile 1 sollte nach installieren der SignalR Nuget Pakete vorhanden sein.

Nun kann man den User per email benachrichtigen

   1:   Clients.User("hannesp@ppedv.de").JavaScriptMethode...
Kommentare sind geschlossen