Freigeben über


Einführung in ASP.NET Identity

Das ASP.NET Mitgliedschaftssystem wurde mit ASP.NET 2.0 im Jahr 2005 eingeführt, und seitdem gibt es viele Änderungen in der Art und Weise, wie Webanwendungen in der Regel Authentifizierung und Autorisierung behandeln. ASP.NET Identity ist ein neuer Blick darauf, was das Mitgliedschaftssystem sein sollte, wenn Sie moderne Anwendungen für das Web, Smartphone oder Tablet erstellen.

Es wird empfohlen, die sicherste Authentifizierungsoption zu verwenden. Informationen zu .NET-Apps, die in Azure bereitgestellt werden, finden Sie unter:

Azure Key Vault und .NET Aspire bieten die sicherste Möglichkeit zum Speichern und Abrufen von Geheimschlüsseln. Azure Key Vault ist ein Clouddienst, der Verschlüsselungsschlüssel und geheime Schlüssel wie Zertifikate, Verbindungszeichenfolgen und Kennwörter schützt. Informationen zu .NET Aspire finden Sie unter Sichere Kommunikation zwischen Hosting- und Clientintegrationen.

Vermeiden Sie die Gewährung der Kennwortanmeldeinformationen des Ressourcenbesitzers, da dies zu folgendem Szenario führen könnte:

  • Macht das Kennwort des Benutzers für den Client verfügbar.
  • Ist ein erhebliches Sicherheitsrisiko.
  • Sollte nur verwendet werden, wenn andere Authentifizierungsflüsse nicht möglich sind.

Wenn die App auf einem Testserver bereitgestellt wird, kann eine Umgebungsvariable verwendet werden, um die Verbindungszeichenfolge auf einen echten Testdatenbankserver festzulegen. Umgebungsvariablen werden in der Regel in nur unverschlüsselten Text gespeichert. Wenn der Computer oder der Prozess kompromittiert ist, können Umgebungsvariablen von nicht vertrauenswürdigen Parteien aufgerufen werden. Es wird davon abgeraten, Umgebungsvariablen zum Speichern einer Produktionsverbindungszeichenfolge zu verwenden, da dies nicht der sicherste Ansatz ist.

Konfigurationsdatenrichtlinien:

  • Speichern Sie niemals Kennwörter oder andere vertrauliche Daten im Konfigurationsanbietercode oder in Nur-Text-Konfigurationsdateien.
  • Verwenden Sie keine Produktionsgeheimnisse in Entwicklungs- oder Testumgebungen.
  • Geben Sie geheime Schlüssel außerhalb des Projekts an, damit sie nicht versehentlich an ein Quellcode-Repository gebunden werden können.

Hintergrund: Mitgliedschaft in ASP.NET

ASP.NET Mitgliedschaft

ASP.NET-Mitgliedschaft wurde entwickelt, um den Anforderungen an die Websitemitgliedschaft zu entsprechen, die 2005 üblich waren, darunter Formularauthentifizierung und eine SQL Server-Datenbank für Benutzernamen, Kennwörter und Profildaten. Heute gibt es eine viel breitere Palette von Datenspeicheroptionen für Webanwendungen, und die meisten Entwickler möchten ihren Websites die Verwendung von Identitätsanbietern für soziale Netzwerke für die Authentifizierung und Autorisierungsfunktionalität ermöglichen. Die Einschränkungen des Designs der ASP.NET Mitgliedschaft erschweren diesen Übergang:

  • Das Datenbankschema wurde für SQL Server entwickelt und kann nicht geändert werden. Sie können Profilinformationen hinzufügen, aber die zusätzlichen Daten werden in eine andere Tabelle gepackt, was es schwierig macht, auf andere Weise als über die Profilanbieter-API darauf zuzugreifen.
  • Mit dem Anbietersystem können Sie den Sicherungsdatenspeicher ändern, das System ist jedoch für Annahmen konzipiert, die für eine relationale Datenbank geeignet sind. Sie können einen Anbieter codieren, um Mitgliedschaftsinformationen in einem nicht relationalen Speichermechanismus zu speichern, wie z. B. Azure-Speichertabellen. In diesem Fall müssen Sie jedoch das relationale Design umgehen, indem Sie viel Code und viele System.NotImplementedException-Ausnahmen für Methoden schreiben, die nicht für NoSQL-Datenbanken gelten.
  • Da die Anmelde-/Abmeldefunktion auf Formularauthentifizierung basiert, kann das Mitgliedschaftssystem OWINnicht verwenden. OWIN umfasst Middleware-Komponenten für die Authentifizierung, einschließlich Unterstützung für Anmeldungen mit externen Identitätsanbietern (z. B. Microsoft-Konten, Facebook, Google, Twitter) und Anmeldungen mithilfe von Organisationskonten aus dem lokalen Active Directory oder Azure Active Directory. OWIN umfasst auch Unterstützung für OAuth 2.0, JWT und CORS.

ASP.NET Einfache Mitgliedschaft

ASP.NET Simple Membership (Einfache Mitgliedschaft) wurde als Mitgliedschaftssystem für ASP.NET-Webseiten entwickelt. Es wurde mit WebMatrix und Visual Studio 2010 SP1 veröffentlicht. Das Ziel von Simple Membership war es, einer Webanwendung die Mitgliedschaftsfunktionalität hinzuzufügen.

Die einfache Mitgliedschaft hat es einfacher gemacht, Benutzerprofilinformationen anzupassen, teilt aber weiterhin die anderen Probleme mit ASP.NET Mitgliedschaft und weist einige Einschränkungen auf:

  • Es war schwierig, Mitgliedschaftssystemdaten in einem nicht relationalen Speicher beizubehalten.
  • Sie können es nicht mit OWIN verwenden.
  • Es funktioniert nicht gut mit vorhandenen ASP.NET Mitgliedschaftsanbietern, und es ist nicht erweiterbar.

ASP.NET-Universelle Anbieter

ASP.NET Universal Providers (Universelle Anbieter) wurde entwickelt, um die Mitgliedschaftsinformationen in der Microsoft Azure SQL-Datenbank beibehalten zu können, und sie arbeiten auch mit SQL Server Compact. Die Universellen Anbieter wurden auf Entity Framework Code First entwickelt, was bedeutet, dass die Universellen Anbieter verwendet werden können, um Daten in jedem Speicher zu speichern, der von EF unterstützt wird. Dank Universal Providers wurde auch das Datenbankschema wesentlich bereinigt.

Die Universellen Anbieter basieren auf der ASP.NET Mitgliedschaftsinfrastruktur, sodass sie weiterhin dieselben Einschränkungen wie der SqlMembership-Anbieter aufweisen. Das heißt, sie wurden für relationale Datenbanken entwickelt und es ist schwierig, Profil- und Benutzerinformationen anzupassen. Diese Anbieter verwenden auch weiterhin die Formularauthentifizierung für die Anmelde- und Abmeldefunktion.

ASP.NET Identität

Da sich die Mitgliedschaftsgeschichte in ASP.NET im Laufe der Jahre weiterentwickelt hat, hat das ASP.NET Team viel von Feedback von Kunden gelernt.

Die Annahme, dass sich Benutzer anmelden, indem sie einen Benutzernamen und ein Kennwort eingeben, das sie in Ihrer eigenen Anwendung registriert haben, ist nicht mehr gültig. Das Web ist sozialer geworden. Benutzer interagieren in Echtzeit über soziale Kanäle wie Facebook, Twitter und andere soziale Websites miteinander. Entwickler möchten, dass sich Benutzer mit ihren sozialen Identitäten anmelden können, damit sie eine umfassende Erfahrung auf ihren Websites haben können. Ein modernes Mitgliedschaftssystem muss umleitungsbasierte Anmeldungen an Authentifizierungsanbieter wie Facebook, Twitter und andere ermöglichen.

Mit der Weiterentwicklung der Webentwicklung entwickelten sich auch die Muster der Webentwicklung. Komponententests von Anwendungscode sind für Anwendungsentwickler von zentraler Bedeutung. Im Jahr 2008 hat ASP.NET ein neues Framework basierend auf dem Model-View-Controller (MVC)-Muster hinzugefügt, um Entwicklern das Erstellen von unit-testbaren ASP.NET-Anwendungen zu erleichtern. Entwickler, die Unit-Tests für ihre Anwendungslogik durchführen wollten, wollten dies auch mit dem Mitgliedschaftssystem können.

Unter Berücksichtigung dieser Änderungen bei der Webanwendungsentwicklung wurde ASP.NET Identity mit den folgenden Zielen entwickelt:

  • Ein ASP.NET Identity System (Identitätssystem)

    • ASP.NET Identity kann mit allen ASP.NET Frameworks verwendet werden, z. B. ASP.NET MVC, Web Forms, Webseiten, Web-API und SignalR.
    • ASP.NET Identität kann verwendet werden, wenn Sie Web-, Telefon-, Speicher- oder Hybridanwendungen erstellen.
  • Vereinfachte Eingabe von Benutzerprofildaten

    • Sie haben die Kontrolle über das Schema von Benutzer- und Profilinformationen. So können Sie das System beispielsweise ganz einfach aktivieren, um von Benutzern eingegebene Geburtsdatum zu speichern, wenn sie ein Konto in Ihrer Anwendung registrieren.
  • Persistenzsteuerung

    • Standardmäßig speichert das ASP.NET Identity-System alle Benutzerinformationen in einer Datenbank. ASP.NET Identity verwendet Entity Framework Code First, um den gesamten Persistenzmechanismus zu implementieren.
    • Da Sie das Datenbankschema steuern, können allgemeine Aufgaben wie das Ändern von Tabellennamen oder das Ändern des Datentyps von Primärschlüsseln einfach ausgeführt werden.
    • Es ist einfach, verschiedene Speichermechanismen wie SharePoint, Azure Storage Table Service, NoSQL-Datenbanken usw. einzubinden, ohne dabei System.NotImplementedExceptions-Ausnahmen auslösen zu müssen.
  • Komponententestbarkeit

    • ASP.NET Identity macht die Webanwendung komponententestfähiger. Sie können Komponententests für die Teile Ihrer Anwendung schreiben, die ASP.NET Identity verwenden.
  • Rollenanbieter

    • Es gibt einen Rollenanbieter, mit dem Sie den Zugriff auf Teile Ihrer Anwendung nach Rollen einschränken können. Sie können auf einfache Weise Rollen wie "Administrator" erstellen und Benutzer zu Rollen hinzufügen.
  • Anspruchsbasiert

    • ASP.NET Identity unterstützt die anspruchsbasierte Authentifizierung, bei der die Identität des Benutzers als Eine Gruppe von Ansprüchen dargestellt wird. Mithilfe von Ansprüchen können Entwickler die Identität eines Benutzers exakter beschreiben als mit Rollen. Während die Rollenmitgliedschaft nur ein boolescher Wert ist (Member oder Nicht-Member), kann ein Anspruch umfangreiche Informationen zur Identität und Mitgliedschaft des Benutzers enthalten.
  • Anbieter für Social Logins (Anmeldung für soziale Netzwerke)

    • Sie können ganz einfach Social Log-Ins wie Microsoft-Konto, Facebook, Twitter, Google und andere zu Ihrer App hinzufügen und die nutzerspezifischen Daten in Ihrer App speichern.
  • OWIN-Integration

    • ASP.NET Authentifizierung basiert jetzt auf OWIN-Middleware, die auf jedem OWIN-basierten Host verwendet werden kann. ASP.NET Identity hat keine Abhängigkeit von System.Web. Es ist ein vollständig kompatibles OWIN-Framework und kann in jeder von OWIN gehosteten Anwendung verwendet werden.
    • ASP.NET Identity verwendet die OWIN-Authentifizierung für die Anmeldung/Abmeldung von Benutzern auf der Website. Dies bedeutet, dass die Anwendung dazu OWIN CookieAuthentication verwendet, anstatt FormsAuthentication zum Generieren des Cookies zu verwenden.
  • NuGet-Paket

    • ASP.NET Identity wird als NuGet-Paket weiterverteilt, das in den ASP.NET MVC-, Webformular- und Web-API-Vorlagen installiert ist, die mit Visual Studio 2017 ausgeliefert werden. Sie können dieses NuGet-Paket aus dem NuGet-Katalog herunterladen.
    • Durch die Veröffentlichung von ASP.NET Identity als NuGet-Paket wird es für das ASP.NET-Team einfacher, an neuen Features und Fehlerbehebungen zu arbeiten und diese in agiler Weise an Entwickler auszuliefern.

Erste Schritte mit ASP.NET Identity

ASP.NET Identity wird in den Visual Studio 2017-Projektvorlagen für ASP.NET MVC, Web Forms, Web API und SPA verwendet. In dieser exemplarischen Vorgehensweise veranschaulichen wir, wie die Projektvorlagen ASP.NET Identity verwenden, um Funktionen zum Registrieren, Anmelden und Abmelden eines Benutzers hinzuzufügen.

ASP.NET Identity wird mithilfe des folgenden Verfahrens implementiert. Der Zweck dieses Artikels besteht darin, Ihnen einen einführenden Überblick über ASP.NET Identity zu geben. Sie können ihm Schritt für Schritt folgen oder einfach die Details lesen. Ausführlichere Anweisungen zum Erstellen von Apps mit ASP.NET Identity, einschließlich der Verwendung der neuen API zum Hinzufügen von Benutzern, Rollen und Profilinformationen, finden Sie im Abschnitt "Nächste Schritte" am Ende dieses Artikels.

  1. Erstellen Sie eine ASP.NET MVC-Anwendung mit einzelnen Konten. Sie können ASP.NET Identity in ASP.NET MVC, Web Forms, Web API, SignalR usw. verwenden. In diesem Artikel beginnen wir mit einer ASP.NET MVC-Anwendung.

    Bild des neuen ASP dot Net-Projektfensters

  2. Das erstellte Projekt enthält die folgenden drei Pakete für ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Dieses Paket enthält die Entity Framework-Implementierung von ASP.NET Identity, die die ASP.NET Identity-Daten und das Schema im SQL Server speichern wird.
    • Microsoft.AspNet.Identity.Core
      Dieses Paket verfügt über die Kernschnittstellen für ASP.NET Identity. Dieses Paket kann verwendet werden, um eine Implementierung für ASP.NET Identity zu schreiben, die auf unterschiedliche Persistenzspeicher wie Azure Table Storage, NoSQL-Datenbanken usw. ausgerichtet ist.
    • Microsoft.AspNet.Identity.OWIN
      Dieses Paket enthält Funktionen, die zum Anschließen der OWIN-Authentifizierung mit ASP.NET Identity in ASP.NET Anwendungen verwendet werden. Dies wird verwendet, wenn Sie Ihrer Anwendung Anmeldefunktionen hinzufügen und OWIN Cookie Authentication Middleware aufrufen, um ein Cookie zu generieren.
  3. Erstellen eines Benutzers.
    Starten Sie die Anwendung, und klicken Sie dann auf den Registrierungslink, um einen Benutzer zu erstellen. Die folgende Abbildung zeigt die Registerseite, auf der der Benutzername und das Kennwort erfasst werden.

    Abbildung: Neues Konto erstellen

    Wenn der Benutzer die Schaltfläche Register auswählt, erstellt die Register-Aktion des Konto-Controllers den Benutzer, indem sie die ASP.NET-Identitäts-API aufruft, wie unten dargestellt:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Anmelden.
    Wenn der erfolgreich erstellt wurde, wird er durch die SignInAsync-Methode angemeldet.

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    Die SignInManager.SignInAsync-Methode generiert eine ClaimsIdentity. Da ASP.NET Identity- und OWIN-Cookie-Authentifizierung anspruchsbasierte Systeme darstellen, erfordert das Framework, dass die App für den Benutzer eine ClaimsIdentity generiert. ClaimsIdentity enthält Informationen zu allen Ansprüchen des Benutzers, z. B. dazu, welche Rollen ihm angehören.

  5. Ausloggen.
    Wählen Sie den Link zum Abmelden, um die Abmeldeaktion im Konto-Controller aufzurufen.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Der oben hervorgehobene Code zeigt die OWIN-AuthenticationManager.SignOut-Methode. Dies ist vergleichbar mit der FormsAuthentication.SignOut-Methode, die vom FormsAuthentication-Modul in Web Forms verwendet wird.

Komponenten von ASP.NET Identity

Im folgende Diagramm sind die die Komponenten des ASP.NET Identity-Systems dargestellt (klicken Sie auf dieses oder auf das Diagramm, um es zu vergrößern). Die Pakete in Grün bilden das ASP.NET Identity-System. Alle anderen Pakete sind Abhängigkeiten, die für die Verwendung des ASP.NET Identity-Systems in ASP.NET Anwendungen erforderlich sind.

Diagramm, das die Komponenten des ASP.Net-Identitätssystems darstellt

Es folgt eine kurze Beschreibung der zuvor nicht erwähnten NuGet-Pakete:

  • Microsoft.Owin.Security.Cookies
    Middleware, die es einer Anwendung ermöglicht, cookie-basierte Authentifizierung zu verwenden, ähnlich wie die ASP.NET-Formularauthentifizierung.
  • EntityFramework
    Entity Framework ist die empfohlene Datenzugriffstechnologie von Microsoft für relationale Datenbanken.

Migrieren von Mitgliedschaft zu ASP.NET Identity

Wir hoffen, bald Anleitungen zum Migrieren Ihrer vorhandenen Apps bereitzustellen, die ASP.NET Mitgliedschaft oder einfache Mitgliedschaft zum neuen ASP.NET Identity-System verwenden.

Nächste Schritte