Seit Lektion 2.13.1 hat die Kladde einen Hub, und angemeldete Personen sehen neue Buchungen sofort. Über dem Hub steht ein einzelnes [Authorize]. In dieser Lektion sehen Sie genauer hin: Was prüft das Attribut, und was nicht? Wer darf welcher Gruppe beitreten? Was passiert, wenn jemand dem Hub eine riesige Nachricht schickt oder hundert Tabs öffnet? Und wie beweist ein Test das alles, ohne dass jemand zwei Browserfenster nebeneinanderlegt?

Ein Hub ist ein Endpunkt wie jeder andere: Was ein Client ihm schickt, ist eine fremde Eingabe (Lektion 2.6.6). Er bekommt dieselbe Sorgfalt wie die API, nur an anderen Stellen.

Was [Authorize] am Hub prüft

[Authorize] über der Klasse des Hubs wirkt an der Tür. MapHub legt zwei Endpunkte an, /hubs/termine/negotiate und /hubs/termine, und gibt beiden das Attribut mit. Wer nicht angemeldet ist, bekommt schon beim ersten Schritt, dem POST an negotiate, eine 401. Seit .NET 10 leitet die Cookie-Anmeldung solche Endpunkte nicht mehr zur Anmeldeseite um (Lektion 2.6.1); der Client sieht die 401 und meldet sie als Fehler.

Drei Dinge prüft das Attribut nicht:

  • Was die Person später darf. SignalR liest den Benutzer einmal, beim Aufbau der Verbindung, und hält ihn für deren ganze Lebensdauer fest. Nimmt die Leitung einer Kollegin heute Mittag eine Rolle weg, behält deren offener Tab die alte Rolle, bis die Verbindung endet. Das gilt für Cookies wie für Tokens und auch bei Long Polling, obwohl dort jede Anfrage neu angemeldet wird. Microsoft nennt zwei Auswege: Verbindungen schließen, damit sie sich neu anmelden (für Tokens mit Ablauf gibt es dafür die Option CloseOnAuthenticationExpiration an MapHub), oder in einer Methode, auf die es ankommt, gegen den aktuellen Stand prüfen. Für die Kladde reicht es, das zu wissen: Ihre Rollen ändern sich selten, und ein Neuladen der Seite baut die Verbindung neu auf.
  • Einzelne Methoden. [Authorize] über der Klasse gilt für die Verbindung. Eine Methode kann eine eigene Regel bekommen, etwa [Authorize(Policy = KladdePolicies.Management)] darüber, genau wie ein Endpunkt der API.
  • Was eine Methode mit ihren Argumenten tut. Ein Hub, der jeden Client jeder Gruppe beitreten lässt, ist trotz [Authorize] offen für alle Angemeldeten. Darum geht es gleich.