mk-prg-net \net \asp \ mvc \authentication-authorization

Authentifizierung und Authorisierung

Quellen

  1. Guter Artikel, der einen Überblick verschafft
  2. Offizielle Dokumentation des Identity Frameworks
  3. Offizielle Dokumentation der Authentifizierung und Authorisierung in ASP.NET MVC
  4. Implementierung einer Rollenbasierten Benutzerverwaltung in ASP.NET MVC 5
  5. Einführung in die Implementierung und Migration von Benutzerdatenbanken mittels EntityFramework
  6. Microsoft.AspNet.Identity

ASP.NET Identity 2.0

ASP.NET Identity bezeichnet das aktuelle Framework zur Authentifizierung von Anwendern. Es entstand als Nachfolger der ASP.NET Membership, welche ab .NET 2.0 die Authentifizierung über ein Providermodell von konkreten Implementierungen abstrahierte.

ASP.NET Membership beschränkte sich auf die Authentifizierung von Benutzern, deren Konten innerhalb einer Webanwendung verwaltet wurden. Mengen von Benutzern können durch Rollen dargestellt werden, die Rechte innehaben.

In der Gegenwart möchte man auch Benutzern den Zugriff auf eine Anwendung ermöglichen, deren Konten von sozialen Netzwerken wie z.B. Facebook ™ verwaltet werden. Zudem ist neben der klassischen Rollenverwaltung eine Zuordnung von Rechten bezüglich erweiterter Benutzerkeigenschaften (Claims) wie z.B. Alter, Geschlecht, Berufsgruppe etc. erwünscht: Die Webanwendung kann spezielle Inhalte für Männer ab einem bestimmten Alter bereithalten, die nur diesen zugänglich sein sollten :-).

Mit der klassischen ASP.NET Membership waren die neuen Anforderungen nicht mehr zu bewältigen. Microsoft entschloss sich, ein neues Framework zu schaffen, genannt ASP.NET Identity. Diese besitzt folgende Merkmale:

  1. Unterstützung von Anmeldung über soziale Netze
  2. Implementierung von Two Factor Authentication
  3. Integration beliebiger benutzerspezifischer Daten in das Anmeldekonto (z.B. Profile)
  4. Unterstützung claims based authorization
  5. Agile Entwicklung auf Basis von EntityFramework Migrations

Das neue Framework ist im Namensraum Microsoft.AspNet.Identity definiert. Es besteht aus Schnittstellen und Klassen, die

  1. Die Grundstruktur von Benutzeridentitäten definieren IdentityUser
  2. Repositories, welche den Zugriff auf Mengen von Benutzern kapseln UserManager<TIdentityUser>
  3. Einer Fassade, die den Authentifizierungsprozess kapselt SignInManager<ApplicationUser, string>

Claim based Identity

Die claim based identity ist ein security- token, welches ein security token service (STS) nach einem erfolgreichen Login für einen User ausstellen. Beispielsweise für STS sind die Live ID von Microsoft oder die Logins von Facebook und Google.

Die security tokens sind digital signiert, enthalten ein Ablaufdatum und eine Reihe von Claims. Claims sind Aussagen über Eigenschaften des Benutzers wie Geburtsdatum, Geschlecht, Gruppenzugehörigkeit. Eine Webanwendung kann mittels öffentlicher Schlüssel die Authentizität des Tokens bestimmen.Gültigen Tokens kann eine Anwendung Zugriffsrechte erteilen. Einschränkungen können dabei auf Basis der Claims erfolgen. Z.B. können bestimmte Angebote nur auf authentifizierte Benutzer ab 18. Jahre eingeschränkt werden.

Technische Grundlage für den Einsatz von security tokens sind die http- redirection Befehle. Dabei beantwortet der Webserver den http- Request auf eine Ressource mit einem Weiterleitungsbefehl an den Browser. Der Weiterleitungsbefehl enthält einen neuen URL, den der Browser erneut anfordert. Mittels der http- redirection kann so eine Zugriffsversuch eines nicht authorisierten Users mit einer Umleitung an einen STS beantwortet werden.

Implementierung der Authentifizierung in einem MVC- Projekt mittels ASP.NET Identity 2.0

Achtung: Die Klassen bieten primär asynchrone Methoden an. Diese funktionieren jedoch nur einwandfrei unter der ASP.NET Laufzeitumgebung. Außerhalb der ASP.NET kommt es insbesondere bei Methoden, die über einen Entity Framework DbContext auf eine Datenbank zugreifen, zu Problemen, da sicherzustellen ist, dass immer nur eine Abfrage zu einem Zeitpunkt über den DBContext abzuwickeln ist. In diesem Fall kann auf die synchronen Erweiterungsemhoden zugegriffen werden.

Verteilung des Quellcodes

Organisation der Quelltexte einer Identity- Implementierung im MVC- Projekt

IUser

Grundlegende Schnittstelle aller Benutzerkonten, Tokens etc. ist die IUser Schnittstelle:

namespace Microsoft.AspNet.Identity {
  public interface IUser<out TKey> {
     // Eindeutige ID eines Users in einem Repository   
     TKey Id {get;}
     // Name des Benutzers
     string UserName {get;}
  }
}

Der UserName kann die Email- Adresse oder der Familienname eines Benutzes sein.

Beim Anlegen eines neuen Benutzers sollte stets eine neue Id vergeben werden, die unterschiedlich von allen zuvor vergebenen ist. Bezüglich der Id werden durch die Implementierung der Identity Zugriffsrechte erteilt oder nicht. Ein neuer Benutzer sollte niemals die Rechte eines ehemaligen Benutzers genießen können, nur weil er rein zufällig seine Id erneut zugeteilt bekommen hat. In der Defaultimplementierung ist die Id vom Typ string, und inhaltlich eine GUID.

Basisklasse IdentityUser

Die Standardimplemneierung der IUser Schnittstele auf Basis des EntityFrameworks ist Microsoft.AspNet.Identity.EntityFramework.IdentityUser.

UserManger

Definieren von Regeln für den Aufbau der Benutzernamen

Der Eigenschaft UserManager.UserValidator kann ein Objekt zugewiesen werden, welches die Microsoft.AspNet.Identity.IIdentityValidator<ApplicationUser> implementiert:

Benutzerdatenbank mit EntityFramework verwalten

Mirgrationen einschalten:

>enable-migrations
Startkonfiguration anlegen:
>add-migration IntialCreate
Änderungen in der Datenbank übernehmen:
update-database

Zugriff auf Actions einschränken

[Authorize]

Nur angemeldete Benutzer dürfen diese Action aufrufen

[Authorize(Roles="A, B")]

Nur Benutzer, die zur Rolle A oder B gehören, dürfen die Action aufrufen.

[AllowAnonymous]

Alle Benutzer dürfen diese Action aufrufen

Claim Based authorization

Zugriff auf aktuellen User, Rolle und Authentifizierungscockie

        
var atuthentifizierungscookie = Request.Cookies[".AspNet.ApplicationCookie"].Value