Webframeworkk/ASP.NET Core/Identitäts- und Autorisierungssicherheit

Aus Dokument
Zur Navigation springen Zur Suche springen

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).


Willkommen zum umfassenden Tutorial über ASP.NET Core Identity und MVC basierend auf unserer Analyse. Dieser Leitfaden deckt Authentifizierung, Autorisierung und wesentliche MVC-Muster ab.

Einführung in ASP.NET Core Identity

ASP.NET Core Identity ist ein robustes und flexibles Mitgliedschaftssystem, mit dem Sie Authentifizierungs- und Autorisierungsfunktionen zu Ihren Webanwendungen hinzufügen können.

Zweck und Hauptmerkmale

  • Benutzerauthentifizierung: Überprüfung der Benutzeridentität und Kontrolle des Zugriffs.
  • Benutzerverwaltung: Handhabung von Registrierung, Login, Logout, Passwort-Resets und Profilverwaltung.
  • Autorisierung:
    • Rollenbasiert (Role-Based): Zugriffsbeschränkung basierend auf Benutzerrollen (z. B. Admin, User).
    • Anspruchsbasiert (Claims-Based): Entscheidungen basierend auf Benutzerattributen (Claims).
  • Externe Logins: Integration mit Google, Facebook usw.
  • Sicherheit: Unterstützung für Zwei-Faktor-Authentifizierung (2FA) und Passwort-Hashing.

Hauptkomponenten

Identity-Modelle

  • ApplicationUser: Erweitert `IdentityUser`. Repräsentiert Benutzer in Ihrer App. Kann benutzerdefinierte Eigenschaften wie `PersonName` enthalten.
  • ApplicationRole: Erweitert `IdentityRole`. Definiert Rollen innerhalb der Anwendung.

Kerndienste (Manager)

Wird über Dependency Injection in Ihren Controllern verwaltet:

  • UserManager<TUser>: Verwaltet Benutzerkonten (Erstellen, Löschen, Suchen, Aktualisieren).
  • SignInManager<TUser>: Kümmert sich um Anmelde- und Abmeldevorgänge.
  • RoleManager<TRole>: Verwaltet Rollen und deren Zuweisung zu Benutzern.

Implementierungsleitfaden

1. Registrierung (POST)

Um einen Benutzer zu registrieren, folgen Sie normalerweise diesen Schritten:

  1. Validieren des DTO (Data Transfer Object).
  2. Erstellen einer `ApplicationUser`-Instanz.
  3. Verwendung von `_userManager.CreateAsync(user, password)`.
  4. Zuweisung einer Standardrolle (z. B. “User” oder “Admin”).
  5. Den Benutzer anmelden.
// Code-Snippet: Einen Benutzer registrieren
ApplicationUser user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await _userManager.CreateAsync(user, registerDTO.Password);

2. Login (POST)

Verwenden Sie den `SignInManager`, um Benutzer zu authentifizieren.

// Code-Snippet: Einen Benutzer anmelden
var result = await _signInManager.PasswordSignInAsync(loginDTO.Email, loginDTO.Password, isPersistent: false, lockoutOnFailure: false);
  • Verwenden Sie ReturnUrl, um Benutzer nach einer erfolgreichen Anmeldung zu ihrem ursprünglichen Ziel zurückzuleiten.

3. Logout

Rufen Sie einfach die Methode zum Abmelden auf:

await _signInManager.SignOutAsync();

Konfiguration in Program.cs

Konfigurieren Sie die Dienste für Identity und Autorisierung in Ihrer Startup-Datei.

Identity-Konfiguration

services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
  options.Password.RequiredLength = 6;
  options.Password.RequireNonAlphanumeric = true;
  options.Password.RequireUppercase = true;
  options.Password.RequireLowercase = true;
  options.Password.RequireDigit = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();

Autorisierungsrichtlinien

services.AddAuthorization(options =>
{
  var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
  options.FallbackPolicy = policy; // Standardmäßig auf alles anwenden
});

Fortgeschrittene MVC-Funktionen

Tag Helper

Verwenden Sie diese in Ihren Views für eine saubere HTML-Generierung:

  • `asp-controller`: Ziel-Controller angeben.
  • `asp-action`: Ziel-Action angeben.
  • `asp-route-returnurl`: Rückgabe-URL übergeben.
  • `asp-validation-for`: Validierungsfehler anzeigen.

Remote-Validierung

Ermöglicht serverseitige Validierung (z. B. Prüfung, ob eine E-Mail bereits existiert) ohne vollständigen Neuladevorgang der Seite.

public class RegisterDTO
{
  [Remote(action: "IsEmailAlreadyRegistered", controller: "Account", ErrorMessage = "E-Mail wird bereits verwendet")]
  public string Email { get; set; }
}

Areas

Organisieren Sie große Anwendungen in logische Module (z. B. ein “Admin”-Bereich).

  • Verwenden Sie das Attribut `[Area(“Admin”)]` an Controllern.
  • Konfigurieren Sie das Area-Routing in der `Program.cs`.

Konventionelles vs. Attribut-Routing

  • Konventionell: Global definiert (z. B. `{controller=Home}/{action=Index}/{id?}`).
  • Attribut: Direkt an Actions mit `[Route(“mein-pfad”)]` definiert.

Best Practices für Sicherheit

  • HTTPS: In der Produktion immer aktivieren.
  • XSRF (CSRF) Schutz:
    • Verwenden Sie `[ValidateAntiForgeryToken]` bei POST-Actions.
    • Nutzen Sie Tag Helper in Formularen, um das Token automatisch einzubinden.
  • Passwortkomplexität: Erzwingen Sie stets starke Passwortregeln.
  • Autorisierungs-Attribute:
    • `[Authorize]`: Beschränkt den Zugriff auf angemeldete Benutzer.
    • `[AllowAnonymous]`: Ermöglicht Zugriff für jeden.

Interview-Schnellreferenz

  • Authentifizierung: Wer bist du? (Identity)
  • Autorisierung: Was darfst du tun? (Rollen/Claims)
  • Claims: Schlüssel-Wert-Paare, die den Benutzer beschreiben (z. B. Geburtsdatum, MitarbeiterID).
  • Rollen vs. Claims: Rollen sind Gruppen; Claims sind spezifische Attribute.

Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).