ASP.NET Core Authentication

30. September 2022

Zuerst zur Definition der zwei Begriffe Authentication und Authorization.

Authentication (Authentifizierung): Wer ist der Benutzer und ist er der, der er vorgibt zu sein?

Authorization (Autorisierung): Was darf der Benutzer bzw. worauf hat er Zugriff?

Authentication (Authentifizierung)

Gibt Auskunft darüber, wer der Benutzer ist und ob er der ist, den er vorgibt zu sein.

Die Authentication wird in ASP.NET Core vom IAuthenticationService gemacht, welcher als Middleware eingebunden ist. In dieser können div. Authentication-Handlers (Schemes), die von der abstrakten Klasse AuthenticationHandler<TOptions> erben, registriert werden.

Zur Verwendung der Middleware muss in der „Configure“-Methode die Methode „UseAuthentication“ aufgerufen werden (nach UseRouting und vor UseEndpoints).

Authentication gibt den ClaimsPrincipal zurück (Eigenschaft User in Controllern), aufgrund dessen mittels Authorization entschieden werden kann, was der aktuelle Benutzer machen darf.

Beim Aufruf von AddAuthentication kann optional ein Delegate übergeben werden. Mit diesem kann gesteuert werden, was die unterschiedlichen Schemes für unterschiedliche Aufgaben sind. Beispielsweise:

  • DefaultAuthenticationScheme: Schema für die Überprüfung, ob der Benutzer der ist, den er vorgibt zu sein.
  • DefaultChallengeScheme: Schema für den Login

Alternativ kann das zu verwendete Authentication-Scheme im Authorize-Attribute angegeben werden.

Sollen mehrere Schemes gleichzeitig greifen, so wird dies mit Policy Schemes gemacht (https://docs.microsoft.com/en-us/aspnet/core/security/authentication/policyschemes?view=aspnetcore-5.0).

Mehr Information zu Authentication sind unter https://learn.microsoft.com/en-us/aspnet/core/security/authentication/?view=aspnetcore-6.0.

Authorization (Authorisierung)

Prüft, ob der Benutzer auf eine Ressource Zugriff hat.

Dies wird standardmäßig mit dem Authorize-Attribut gemacht, dass auf einen Controller oder eine Controller-Action gesetzt wird.

Wird das Attribut ohne weitere Parameter verwendet, so bedeutet dies rein, dass die Ressource nur von angemeldetem Benutzer aufgerufen werden darf.

Wird das Attribut sowohl auf dem Controller als auch auf der Action angegeben, dann müssen beide positiv validieren.

Rollen-basierte Authorization

Im Authorize-Attribut können eine oder mehrere Rollen angegeben werden (Parameter Roles; bei der Angabe von mehreren Rollen werden diese durch Komma getrennt), von denen der Benutzer zumindest eine besitzen muss (einen Claim vom Typ Rolle).

Policy-basierte Authorization

Neben der einfachen Rollen-basierten Authorization kann auch mit Policies gearbeitet werden, die mehr Möglichkeiten haben.

Die Policies werden beim Aufruf von AddAuthorization mit Delegate definiert, indem dort AddPolicy aufgerufen wird.

Eine Policy kann bspw. vorschreiben, dass der Principal bestimmte Rollen (RequireRole) oder bestimmte Claims (RequireClaims) besitzen muss.

Weiters unterstützen Policies Requirements, die mittels „Requirements.Add“ hinzugefügt werden können. Ein Requirement ist eine Klasse, die das IAuthorizationRequirement-Interface implementiert. Zusätzlich dazu muss eine Handler-Klasse erstellt werden, die das IAuthorizationHandler-Interface implementiert, und bei der Initialisierung der Services mit „AddSingleton<IAuthorizationHandler, MeinHandler>()“ registriert wird. Dadurch kann ein Requirement auf alle möglichen Informationen, wie z. B. Claims, des Principals zugreifen und diese gezielter auswerten.

Im Authorize-Attribut kann die benötigte Policy angegeben werden (Parameter Policy).

Weitere Informationen sind unter https://learn.microsoft.com/en-us/aspnet/core/security/authorization/introduction?view=aspnetcore-6.0