Webframeworkk/ASP.NET Core/Identitäts- und Autorisierungssicherheit
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
: Verwaltet Benutzerkonten (Erstellen, Löschen, Suchen, Aktualisieren). - SignInManager
: Kümmert sich um Anmelde- und Abmeldevorgänge. - RoleManager
: Verwaltet Rollen und deren Zuweisung zu Benutzern.
Implementierungsleitfaden
1. Registrierung (POST)
Um einen Benutzer zu registrieren, folgen Sie normalerweise diesen Schritten:
- Validieren des DTO (Data Transfer Object).
- Erstellen einer `ApplicationUser`-Instanz.
- Verwendung von `_userManager.CreateAsync(user, password)`.
- Zuweisung einer Standardrolle (z. B. "User" oder "Admin").
- 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.