© 300 librarians/Shutterstock.com
Authentifizierung und Autorisierung in Blazor

Mit Blazor auf der sicheren Seite


Auf den Benutzer zugeschnittene Informationen anzuzeigen und Inhalte vor unberechtigtem Zugriff zu schützen zählt zu den grundlegenden Funktionen fast jeder Webanwendung. Wir schauen uns in diesem Artikel an, welche Features für Authentifizierung und Autorisierung in Blazor zur Verfügung stehen und wie diese umgesetzt werden können.

Technisch gesehen sind dazu zwei Dinge notwendig: Als Erstes muss die Identität des Benutzers verifiziert werden (Authentifizierung) und als Zweites muss festgelegt werden, auf welche Inhalte der Benutzer Zugriff hat (Autorisierung). Da es sich um sehr grundlegende Anforderungen handelt, werden von den meisten Web-Frameworks dafür bereits sehr einfach zu nutzende Funktionen zur Verfügung gestellt. Dazu ist es nicht immer notwendig, zu verstehen, was genau im Hintergrund passiert. Für ein besseres Verständnis und für komplexere Szenarien ist es aber von Vorteil, sich mit den Interna zu befassen.

Authentifizierung

Bei der Authentifizierung geht es darum, sicherzustellen, dass der Benutzer auch wirklich derjenige ist, für den er sich ausgibt. Die gängigste Variante ist immer noch die Authentifizierung per Benutzername und Passwort. Zusätzlich kommt immer häufiger eine Zwei-Wege-Authentifizierung zum Einsatz, bei der neben dem Passwort beispielsweise auch ein Code per SMS verschickt wird oder die Freigabe in einer Mobile-App notwendig ist. Eine weitere häufige Anforderung ist Single Sign-on (SSO), damit sich die Benutzer nicht bei jeder Anwendung neu anmelden müssen, und die Integration von externen Anbietern wie Facebook und Google. Das Gute ist, dass man sich in der Regel nicht selbst um diese Themen kümmern muss und sollte. Bei sicherheitskritischen Aufgaben empfiehlt es sich, fertige Bibliotheken, wie z. B. ASP.NET Core Identity oder IdentityServer, einzubinden. Oder man verwendet einen Identity-as-a-Service-Anbieter (IDaaS) wie Auth0 oder Azure Active Directory.

Egal, für welche Variante man sich entscheidet, man muss seine Anwendung mit den passenden Einstellungen konfigurieren. Bei der Konfiguration und Funktionsweise der Authentifizierung muss zwischen Blazor Server und Blazor WebAssembly unterschieden werden. Werfen wir aber zuerst einen Blick auf die Gemeinsamkeiten. Um zu überprüfen, ob ein Benutzer bereits authentifiziert ist oder nicht, wird der AuthenticationStateProvider verwendet (Listing 1). Dabei handelt es sich um eine abstrakte Klasse, die für verschiedene Anwendungsfälle implementiert werden kann.

Listing 1

public abstract class AuthenticationStateProvider { public abstract Task<AuthenticationState> GetAuthenticationStateAsync(); public event AuthenticationStateChangedHandler AuthenticationStateChanged; protected void NotifyAuthenticationStateChanged(Task<AuthenticationState> task) { ... } }

Jedes Mal, wenn der aktuelle Status der Authentifizierung benötigt wird, wird die GetAuthenticationStateAsync()-Methode aufgerufen (Listing 2). Diese Methode liefert den AuthenticationState, dessen einzige Property ein ClaimsPrincipal mit dem Namen User ist.

Listing 2

public class AuthenticationState { public AuthenticationState(ClaimsPrincipal user) { User = user ?? throw new ArgumentNullException(nameof(user)); } public ClaimsPrincipal User { get; } }

Wie man dem Constructor entnehmen kann, ist User niemals null, auch wenn der Benutzer nicht authentifiziert ist. Ob der Benutzer authentifiziert ist oder nicht, sehen wir in User.Identity.IsAuthenticated. In den meisten Fällen müssen wir den AuthenticationStateProvider nicht direkt verwenden, sondern können eine der von Blazor mitgelieferten Komponenten nutzen, die uns einiges an Arbeit abnehmen. Eine Möglichkeit ist zum Beispiel die CascadingAuthenticationState-Komponente (Listing 3). Sie stellt einen CascadingParameter zur Verfügung, mit dem man direkt auf den AuthenticationState zugreifen kann. Dieser wird als Task bereitgestellt, um auch asynchrone Abfragen zu unterstützen. Damit in einer Komponente auf den Parameter zugegriffen werden kann, muss sie mit dem CascadingAuthenticationState umgeben werden. Üblicherweise macht man das einmal in der App.razor-Datei, damit der CascadingParameter überall in der Anwendung verfügbar ist.

Listing 3

<CascadingAuthenticationState> <Router AppAssembly="@typeof(Program).Assembly"> <Found Context="routeData"> <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" /> </Found> <NotFound> <LayoutView Layout="@typeof(MainLayout)"> <p>Sorry, there's nothing at this address.</p> </LayoutView> </NotFound> </Router> </CascadingAuthenticationState...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang