Dela via


Introduktion till ASP.NET identitet

Det ASP.NET medlemskapssystemet introducerades med ASP.NET 2.0 redan 2005, och sedan dess har det skett många ändringar i hur webbprogram vanligtvis hanterar autentisering och auktorisering. ASP.NET Identitet är en ny titt på vad medlemskapssystemet ska vara när du skapar moderna program för webben, telefonen eller surfplattan.

Vi rekommenderar att du använder det säkraste autentiseringsalternativet. Information om .NET-appar som distribuerats till Azure finns i:

Azure Key Vault och .NET Aspire är det säkraste sättet att lagra och hämta hemligheter. Azure Key Vault är en molntjänst som skyddar krypteringsnycklar och hemligheter som certifikat, anslutningssträngar och lösenord. Information om .NET Aspire finns i Säker kommunikation mellan värd- och klientintegreringar.

Undvik resursägarens lösenordsautentisering eftersom det:

  • Exponerar användarens lösenord för klienten.
  • Är en betydande säkerhetsrisk.
  • Bör endast användas när andra autentiseringsflöden inte är möjliga.

När appen distribueras till en testserver kan en miljövariabel användas för att ange anslutningssträngen till en testdatabasserver. Miljövariabler lagras vanligtvis i oformaterad, okrypterad text. Om datorn eller processen komprometteras kan miljövariabler nås av ej betrodda parter. Vi rekommenderar att du inte använder miljövariabler för att lagra en produktionsanslutningssträng eftersom det inte är den säkraste metoden.

Riktlinjer för konfigurationsdata:

  • Lagra aldrig lösenord eller andra känsliga data i konfigurationsproviderns kod eller i konfigurationsfiler för oformaterad text.
  • Använd inte produktionshemligheter i utvecklings- eller testmiljöer.
  • Ange hemligheter utanför projektet så att de inte av misstag kan checkas in på en källkodslagringsplats.

Bakgrund: Medlemskap i ASP.NET

ASP.NET medlemskap

ASP.NET Medlemskap utformades för att lösa krav på webbplatsmedlemskap som var vanliga 2005, vilket omfattade formulärautentisering och en SQL Server-databas för användarnamn, lösenord och profildata. Idag finns det en mycket bredare uppsättning datalagringsalternativ för webbprogram, och de flesta utvecklare vill att deras webbplatser ska kunna använda sociala identitetsprovidrar för autentiserings- och auktoriseringsfunktioner. Begränsningarna i ASP.NET medlemskapets design gör övergången svår:

  • Databasschemat har utformats för SQL Server och du kan inte ändra det. Du kan lägga till profilinformation, men ytterligare data packas i en annan tabell, vilket gör det svårt att komma åt på något sätt förutom via API:et för profilprovidern.
  • Med providersystemet kan du ändra lagringen av säkerhetskopierade data, men systemet är utformat kring antaganden som är lämpliga för en relationsdatabas. Du kan skriva en provider för att lagra medlemskapsinformation i en icke-relationell lagringsmekanism, till exempel Azure Storage-tabeller, men sedan måste du kringgå relationsdesignen genom att skriva mycket kod och många System.NotImplementedException undantag för metoder som inte gäller för NoSQL-databaser.
  • Eftersom inloggnings-/utloggningsfunktionen baseras på formulärautentisering kan medlemskapssystemet inte använda OWIN-. OWIN innehåller mellanprogramskomponenter för autentisering, inklusive stöd för inloggningar med externa identitetsprovidrar (till exempel Microsoft-konton, Facebook, Google, Twitter) och inloggningar med organisationskonton från lokala Active Directory eller Azure Active Directory. OWIN har även stöd för OAuth 2.0, JWT och CORS.

ASP.NET enkelt medlemskap

ASP.NET enkelt medlemskap utvecklades som ett medlemskapssystem för ASP.NET webbsidor. Den släpptes med WebMatrix och Visual Studio 2010 SP1. Målet med Enkelt medlemskap var att göra det enkelt att lägga till medlemskapsfunktioner i ett webbsidor-program.

Enkelt medlemskap gjorde det enklare att anpassa användarprofilinformation, men det delar fortfarande de andra problemen med ASP.NET Medlemskap, och det har vissa begränsningar:

  • Det var svårt att bevara systemdata för medlemskap i ett icke-relationslager.
  • Du kan inte använda den med OWIN.
  • Det fungerar inte bra med befintliga ASP.NET medlemskapsproviders, och det är inte utökningsbart.

ASP.NET universella leverantörer

ASP.NET Universal Providers har utvecklats för att göra det möjligt att bevara medlemskapsinformation i Microsoft Azure SQL Database, och de fungerar även med SQL Server Compact. Universal Providers byggdes på Entity Framework Code First, vilket innebär att de universella leverantörerna kan användas för att bevara data i alla lager som stöds av EF. Med Universal Providers rensades även databasschemat upp ganska mycket.

Universal Providers bygger på infrastrukturen för ASP.NET Medlemskap, så de har fortfarande samma begränsningar som SqlMembership-providern. De har utformats för relationsdatabaser och det är svårt att anpassa profil- och användarinformation. Dessa leverantörer använder fortfarande formulärautentisering för inloggnings- och utloggningsfunktioner.

ASP.NET identitet

I takt med att medlemskapshistorien i ASP.NET har utvecklats genom åren har ASP.NET-teamet lärt sig mycket av feedback från kunder.

Antagandet att användarna loggar in genom att ange ett användarnamn och lösenord som de har registrerat i ditt eget program är inte längre giltigt. Webben har blivit mer social. Användare interagerar med varandra i realtid via sociala kanaler som Facebook, Twitter och andra sociala webbplatser. Utvecklare vill att användarna ska kunna logga in med sina sociala identiteter så att de kan ha en omfattande upplevelse på sina webbplatser. Ett modernt medlemskapssystem måste aktivera omdirigeringsbaserade inloggningar till autentiseringsleverantörer som Facebook, Twitter och andra.

I takt med att webbutvecklingen utvecklades utvecklades även webbutvecklingsmönstren. Enhetstestning av programkod blev ett centralt problem för programutvecklare. Under 2008 lade ASP.NET till ett nytt ramverk baserat på MVC-mönstret (Model-View-Controller), delvis för att hjälpa utvecklare att skapa enhetstestbara ASP.NET program. Utvecklare som ville enhetstesta sin programlogik ville också kunna göra det med medlemskapssystemet.

Med tanke på dessa ändringar i webbprogramutveckling utvecklades ASP.NET identitet med följande mål:

  • Ett ASP.NET identitetssystem

    • ASP.NET identitet kan användas med alla ASP.NET ramverk, till exempel ASP.NET MVC, webbformulär, webbsidor, webb-API och SignalR.
    • ASP.NET identitet kan användas när du skapar webb-, telefon-, butiks- eller hybridprogram.
  • Enkelt att ansluta profildata om användaren

    • Du har kontroll över schemat för användar- och profilinformation. Du kan till exempel enkelt göra det möjligt för systemet att lagra födelsedatum som angetts av användare när de registrerar ett konto i ditt program.
  • beständighetskontroll

    • Som standard lagrar ASP.NET Identity-systemet all användarinformation i en databas. ASP.NET Identity använder Entity Framework Code First för att implementera all sin beständighetsmekanism.
    • Eftersom du styr databasschemat är vanliga uppgifter som att ändra tabellnamn eller ändra datatypen för primära nycklar enkla att göra.
    • Det är enkelt att ansluta olika lagringsmekanismer som SharePoint, Azure Storage Table Service, NoSQL-databaser osv. utan att behöva utlösa System.NotImplementedExceptions undantag.
  • Enhetstestbarhet

    • ASP.NET identitet gör webbprogrammet mer enhetstestbart. Du kan skriva enhetstester för de delar av programmet som använder ASP.NET identitet.
  • Rollprovider

    • Det finns en rollprovider som gör att du kan begränsa åtkomsten till delar av ditt program efter roller. Du kan enkelt skapa roller som "Admin" och lägga till användare i roller.
  • Anspråksbaserad strategi

    • ASP.NET Identity stöder anspråksbaserad autentisering, där användarens identitet representeras som en uppsättning anspråk. Anspråk gör det möjligt för utvecklare att vara mycket mer uttrycksfulla när de beskriver en användares identitet än vad roller tillåter. Eftersom rollmedlemskap bara är ett booleskt värde (medlem eller inte medlem), kan ett krav innehålla omfattande information om användarens identitet och medlemskap.
  • Sociala inloggningsleverantörer

    • Du kan enkelt lägga till sociala inloggningar som Microsoft-konto, Facebook, Twitter, Google och andra i ditt program och lagra användarspecifika data i ditt program.
  • OWIN Integration

    • ASP.NET autentisering baseras nu på OWIN-mellanprogram som kan användas på valfri OWIN-baserad värd. ASP.NET identiteten har inget beroende av System.Web. Det är ett fullständigt kompatibelt OWIN-ramverk och kan användas i alla OWIN-värdbaserade program.
    • ASP.NET Identity använder OWIN-autentisering för inloggning/utloggning av användare på webbplatsen. Det innebär att i stället för att använda FormsAuthentication för att generera cookien använder programmet OWIN CookieAuthentication för att göra det.
  • NuGet-paket

    • ASP.NET Identity distribueras om som ett NuGet-paket som är installerat i mallarna ASP.NET MVC, Web Forms och Web API som levereras med Visual Studio 2017. Du kan ladda ned det här NuGet-paketet från NuGet-galleriet.
    • Genom att släppa ASP.NET identitet som ett NuGet-paket blir det enklare för ASP.NET-teamet att iterera nya funktioner och buggkorrigeringar och leverera dem till utvecklare på ett agilt sätt.

Kom igång med ASP.NET identitet

ASP.NET Identity används i Visual Studio 2017-projektmallarna för ASP.NET MVC, Webbformulär, Webb-API och SPA. I den här genomgången visar vi hur projektmallarna använder ASP.NET identitet för att lägga till funktioner för att registrera, logga in och logga ut en användare.

ASP.NET identitet implementeras med hjälp av följande procedur. Syftet med den här artikeln är att ge dig en översikt över ASP.NET identitet; Du kan följa den steg för steg eller bara läsa informationen. Mer detaljerade anvisningar om hur du skapar appar med hjälp av ASP.NET identitet, inklusive användning av det nya API:et för att lägga till användare, roller och profilinformation finns i avsnittet Nästa steg i slutet av den här artikeln.

  1. Skapa ett ASP.NET MVC-program med enskilda konton. Du kan använda ASP.NET identitet i ASP.NET MVC, webbformulär, webb-API, SignalR osv. I den här artikeln börjar vi med ett ASP.NET MVC-program.

    Bild av det nya ASP dot Net-projektfönstret

  2. Det skapade projektet innehåller följande tre paket för ASP.NET identitet.

    • Microsoft.AspNet.Identity.EntityFramework
      Det här paketet har Entity Framework-implementeringen av ASP.NET identitet som bevarar ASP.NET identitetsdata och schema till SQL Server.
    • Microsoft.AspNet.Identity.Core
      Det här paketet har kärngränssnitten för ASP.NET identitet. Det här paketet kan användas för att skriva en implementering för ASP.NET identitet som riktar sig till olika beständighetslager, till exempel Azure Table Storage, NoSQL-databaser osv.
    • Microsoft.AspNet.Identity.OWIN
      Det här paketet innehåller funktioner som används för att ansluta OWIN-autentisering med ASP.NET identitet i ASP.NET program. Detta används när du lägger till inloggningsfunktioner i ditt program och anropar till OWIN Cookie Authentication-mellanprogram för att generera en cookie.
  3. Skapa en användare.
    Starta programmet och klicka sedan på länken Registrera för att skapa en användare. Följande bild visar sidan Registrera som samlar in användarnamn och lösenord.

    Bild av skapa nytt konto

    När användaren väljer knappen Registrera skapar Register-åtgärden för kontokontrollanten användaren genom att anropa API:et ASP.NET Identity enligt nedan:

    [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. Logga in.
    Om användaren har skapats, loggas hon in av metoden SignInAsync.

     [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);
     }
    

    Metoden SignInManager.SignInAsync genererar en ClaimsIdentity. Eftersom ASP.NET identitet och OWIN-cookieautentisering är anspråksbaserade system kräver ramverket att appen genererar en ClaimsIdentity för användaren. ClaimsIdentity innehåller information om alla anspråk för användaren, till exempel vilka roller användaren tillhör.

  5. Logga ut.
    Välj länken Logga ut för att anropa åtgärden LogOff i kontokontrollanten.

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

    Den markerade koden ovan visar metoden OWIN AuthenticationManager.SignOut. Detta motsvarar FormsAuthentication.SignOut metod som används av modulen FormsAuthentication i Web Forms.

Komponenter i ASP.NET identitet

Diagrammet nedan visar komponenterna i ASP.NET identitetssystemet (välj på den här eller i diagrammet för att förstora det). Paketen i grönt utgör ASP.NET identitetssystemet. Alla andra paket är beroenden som behövs för att använda ASP.NET identitetssystemet i ASP.NET program.

diagram som visar komponenterna i A S P dot Net-identitetssystemet

Följande är en kort beskrivning av De NuGet-paket som inte nämnts tidigare:

  • Microsoft.Owin.Security.Cookies
    Mellanprogram som gör det möjligt för ett program att använda cookiebaserad autentisering, liknande ASP. NET:s formulärautentisering.
  • EntityFramework
    Entity Framework är Microsofts rekommenderade dataåtkomstteknik för relationsdatabaser.

Migrera från medlemskap till ASP.NET identitet

Vi hoppas snart kunna ge vägledning om hur du migrerar befintliga appar som använder ASP.NET medlemskap eller enkelt medlemskap till det nya ASP.NET identitetssystemet.

Nästa steg