Webframeworkk/ASP.NET Core/Identitäts- und Autorisierungssicherheit: Unterschied zwischen den Versionen

Aus Dokument
Zur Navigation springen Zur Suche springen
imported>Import
Version 207
 
Die Seite wurde neu angelegt: „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 ==…“
 
Zeile 5: Zeile 5:


== Einführung in ASP.NET Core Identity ==
== 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.
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 ===
=== Zweck und Hauptmerkmale ===
* '''Benutzerauthentifizierung:''' Überprüfung der Benutzeridentität und Kontrolle des Zugriffs.
* '''Benutzerauthentifizierung:''' Überprüfung der Benutzeridentität und Kontrolle des Zugriffs.
* '''Benutzerverwaltung:''' Handhabung von Registrierung, Login, Logout, Passwort-Resets und Profilverwaltung.
* '''Benutzerverwaltung:''' Handhabung von Registrierung, Login, Logout, Passwort-Resets und Profilverwaltung.
* '''Autorisierung:'''
* '''Autorisierung:'''  
** '''Rollenbasiert (Role-Based):''' Zugriffsbeschränkung basierend auf Benutzerrollen (z. B. Admin, User).
** '''Rollenbasiert (Role-Based):''' Zugriffsbeschränkung basierend auf Benutzerrollen (z. B. Admin, User).
** '''Anspruchsbasiert (Claims-Based):''' Entscheidungen basierend auf Benutzerattributen (Claims).
** '''Anspruchsbasiert (Claims-Based):''' Entscheidungen basierend auf Benutzerattributen (Claims).
Zeile 21: Zeile 19:


=== Identity-Modelle ===
=== Identity-Modelle ===
* '''ApplicationUser:''' Erweitert `IdentityUser`. Repräsentiert Benutzer in Ihrer App. Kann benutzerdefinierte Eigenschaften wie `PersonName` enthalten.
* '''ApplicationUser:''' Erweitert `IdentityUser`. Repräsentiert Benutzer in Ihrer App. Kann benutzerdefinierte Eigenschaften wie `PersonName` enthalten.
* '''ApplicationRole:''' Erweitert `IdentityRole`. Definiert Rollen innerhalb der Anwendung.
* '''ApplicationRole:''' Erweitert `IdentityRole`. Definiert Rollen innerhalb der Anwendung.


=== Kerndienste (Manager) ===
=== Kerndienste (Manager) ===
Wird über Dependency Injection in Ihren Controllern verwaltet:
Wird über Dependency Injection in Ihren Controllern verwaltet:
* '''UserManager<TUser>:''' Verwaltet Benutzerkonten (Erstellen, Löschen, Suchen, Aktualisieren).
* '''UserManager<TUser>:''' Verwaltet Benutzerkonten (Erstellen, Löschen, Suchen, Aktualisieren).
* '''SignInManager<TUser>:''' Kümmert sich um Anmelde- und Abmeldevorgänge.
* '''SignInManager<TUser>:''' Kümmert sich um Anmelde- und Abmeldevorgänge.
Zeile 36: Zeile 31:


=== 1. Registrierung (POST) ===
=== 1. Registrierung (POST) ===
Um einen Benutzer zu registrieren, folgen Sie normalerweise diesen Schritten:
Um einen Benutzer zu registrieren, folgen Sie normalerweise diesen Schritten:
# Validieren des DTO (Data Transfer Object).
# Validieren des DTO (Data Transfer Object).
# Erstellen einer `ApplicationUser`-Instanz.
# Erstellen einer `ApplicationUser`-Instanz.
# Verwendung von `_userManager.CreateAsync(user, password)`.
# Verwendung von `_userManager.CreateAsync(user, password)`.
# Zuweisung einer Standardrolle (z. B. “User” oder “Admin”).
# Zuweisung einer Standardrolle (z. B. "User" oder "Admin").
# Den Benutzer anmelden.
# Den Benutzer anmelden.


<syntaxhighlight lang="csharp">// Code-Snippet: Einen Benutzer registrieren
<syntaxhighlight lang="csharp">
// Code-Snippet: Einen Benutzer registrieren
ApplicationUser user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
ApplicationUser user = new ApplicationUser() { UserName = model.Email, Email = model.Email };
IdentityResult result = await _userManager.CreateAsync(user, registerDTO.Password);</syntaxhighlight>
IdentityResult result = await _userManager.CreateAsync(user, registerDTO.Password);
</syntaxhighlight>
 
=== 2. Login (POST) ===
=== 2. Login (POST) ===
Verwenden Sie den `SignInManager`, um Benutzer zu authentifizieren.
Verwenden Sie den `SignInManager`, um Benutzer zu authentifizieren.
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">// Code-Snippet: Einen Benutzer anmelden
// Code-Snippet: Einen Benutzer anmelden
var result = await _signInManager.PasswordSignInAsync(loginDTO.Email, loginDTO.Password, isPersistent: false, lockoutOnFailure: false);</syntaxhighlight>
var result = await _signInManager.PasswordSignInAsync(loginDTO.Email, loginDTO.Password, isPersistent: false, lockoutOnFailure: false);
</syntaxhighlight>
* Verwenden Sie '''ReturnUrl''', um Benutzer nach einer erfolgreichen Anmeldung zu ihrem ursprünglichen Ziel zurückzuleiten.
* Verwenden Sie '''ReturnUrl''', um Benutzer nach einer erfolgreichen Anmeldung zu ihrem ursprünglichen Ziel zurückzuleiten.


=== 3. Logout ===
=== 3. Logout ===
Rufen Sie einfach die Methode zum Abmelden auf:
Rufen Sie einfach die Methode zum Abmelden auf:
<syntaxhighlight lang="csharp">
await _signInManager.SignOutAsync();
</syntaxhighlight>


<syntaxhighlight lang="csharp">await _signInManager.SignOutAsync();</syntaxhighlight>
== Konfiguration in Program.cs ==
== Konfiguration in Program.cs ==
Konfigurieren Sie die Dienste für Identity und Autorisierung in Ihrer Startup-Datei.
Konfigurieren Sie die Dienste für Identity und Autorisierung in Ihrer Startup-Datei.


=== Identity-Konfiguration ===
=== Identity-Konfiguration ===
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
   options.Password.RequiredLength = 6;
   options.Password.RequiredLength = 6;
   options.Password.RequireNonAlphanumeric = true;
   options.Password.RequireNonAlphanumeric = true;
Zeile 75: Zeile 71:
})
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();</syntaxhighlight>
.AddDefaultTokenProviders();
</syntaxhighlight>
 
=== Autorisierungsrichtlinien ===
=== Autorisierungsrichtlinien ===
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">services.AddAuthorization(options =>
services.AddAuthorization(options =>
{
{
   var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
   var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
   options.FallbackPolicy = policy; // Standardmäßig auf alles anwenden
   options.FallbackPolicy = policy; // Standardmäßig auf alles anwenden
});</syntaxhighlight>
});
</syntaxhighlight>
 
== Fortgeschrittene MVC-Funktionen ==
== Fortgeschrittene MVC-Funktionen ==


=== Tag Helper ===
=== Tag Helper ===
Verwenden Sie diese in Ihren Views für eine saubere HTML-Generierung:
Verwenden Sie diese in Ihren Views für eine saubere HTML-Generierung:
* `asp-controller`: Ziel-Controller angeben.
* `asp-controller`: Ziel-Controller angeben.
* `asp-action`: Ziel-Action angeben.
* `asp-action`: Ziel-Action angeben.
Zeile 95: Zeile 93:


=== Remote-Validierung ===
=== Remote-Validierung ===
Ermöglicht serverseitige Validierung (z. B. Prüfung, ob eine E-Mail bereits existiert) ohne vollständigen Neuladevorgang der Seite.
Ermöglicht serverseitige Validierung (z. B. Prüfung, ob eine E-Mail bereits existiert) ohne vollständigen Neuladevorgang der Seite.
 
<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">public class RegisterDTO
public class RegisterDTO
{
{
   [Remote(action: "IsEmailAlreadyRegistered", controller: "Account", ErrorMessage = "E-Mail wird bereits verwendet")]
   [Remote(action: "IsEmailAlreadyRegistered", controller: "Account", ErrorMessage = "E-Mail wird bereits verwendet")]
   public string Email { get; set; }
   public string Email { get; set; }
}</syntaxhighlight>
}
</syntaxhighlight>
 
=== Areas ===
=== Areas ===
 
Organisieren Sie große Anwendungen in logische Module (z. B. ein "Admin"-Bereich).
Organisieren Sie große Anwendungen in logische Module (z. B. ein “Admin”-Bereich).
* Verwenden Sie das Attribut `[Area("Admin")]` an Controllern.
 
* Verwenden Sie das Attribut `[Area(“Admin”)]` an Controllern.
* Konfigurieren Sie das Area-Routing in der `Program.cs`.
* Konfigurieren Sie das Area-Routing in der `Program.cs`.


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


== Best Practices für Sicherheit ==
== Best Practices für Sicherheit ==
* '''HTTPS:''' In der Produktion immer aktivieren.
* '''HTTPS:''' In der Produktion immer aktivieren.
* '''XSRF (CSRF) Schutz:'''
* '''XSRF (CSRF) Schutz:'''  
** Verwenden Sie `[ValidateAntiForgeryToken]` bei POST-Actions.
** Verwenden Sie `[ValidateAntiForgeryToken]` bei POST-Actions.
** Nutzen Sie Tag Helper in Formularen, um das Token automatisch einzubinden.
** Nutzen Sie Tag Helper in Formularen, um das Token automatisch einzubinden.
Zeile 127: Zeile 122:


== Interview-Schnellreferenz ==
== Interview-Schnellreferenz ==
* '''Authentifizierung:''' Wer bist du? (Identity)
* '''Authentifizierung:''' Wer bist du? (Identity)
* '''Autorisierung:''' Was darfst du tun? (Rollen/Claims)
* '''Autorisierung:''' Was darfst du tun? (Rollen/Claims)
* '''Claims:''' Schlüssel-Wert-Paare, die den Benutzer beschreiben (z. B. Geburtsdatum, MitarbeiterID).
* '''Claims:''' Schlüssel-Wert-Paare, die den Benutzer beschreiben (z. B. Geburtsdatum, MitarbeiterID).
* '''Rollen vs. Claims:''' Rollen sind Gruppen; Claims sind spezifische Attribute.
* '''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).''
''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).''

Aktuelle Version vom 28. Februar 2026, 04:57 Uhr

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).