Authentifizierung und Authorisierung
Quellen
- Guter Artikel, der einen Überblick verschafft
- Offizielle Dokumentation des Identity Frameworks
- Offizielle Dokumentation der Authentifizierung und Authorisierung in ASP.NET MVC
- Implementierung einer Rollenbasierten Benutzerverwaltung in ASP.NET MVC 5
- Einführung in die Implementierung und Migration von Benutzerdatenbanken mittels EntityFramework
- 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:
- Unterstützung von Anmeldung über soziale Netze
- Implementierung von Two Factor Authentication
- Integration beliebiger benutzerspezifischer Daten in das Anmeldekonto (z.B. Profile)
- Unterstützung claims based authorization
- Agile Entwicklung auf Basis von EntityFramework Migrations
Das neue Framework ist im Namensraum Microsoft.AspNet.Identity
definiert.
Es besteht aus Schnittstellen und Klassen, die
- Die Grundstruktur von Benutzeridentitäten definieren
IdentityUser
- Repositories, welche den Zugriff auf Mengen von Benutzern kapseln
UserManager<TIdentityUser>
- 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
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-migrationsStartkonfiguration 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 |
Zugriff auf aktuellen User, Rolle und Authentifizierungscockie
var atuthentifizierungscookie = Request.Cookies[".AspNet.ApplicationCookie"].Value