Dela via


Scaffold Identity i ASP.NET Core-projekt

Av Rick Anderson

Blazor Identity byggnadsställning

ASP.NET Core scaffolding Identity lägger till ASP.NET Core Identity till Blazor Web Apps och Blazor Serverappar. Efter att skaparverktyget har lagt till komponenterna IdentityRazor i appen kan du anpassa komponenterna så att de passar appens krav.

Även om scaffoldern genererar den C#-kod som krävs för att integrera Identity i appen, måste du uppdatera projektets databas med en Entity Framework (EF) Core-databas-migrering för att slutföra processen. I den här artikeln beskrivs de steg som krävs för att migrera en databas.

Granska ändringarna efter att du har kört Identity-generatorn. Vi rekommenderar att du använder GitHub eller ett annat källkontrollsystem som visar filändringar med funktionen återställda ändringar.

Tjänster krävs när du använder tvåfaktorautentisering (2FA),kontobekräftelse och lösenordsåterställning och andra säkerhetsfunktioner med Identity. Tjänster eller tjänststubbar genereras inte när man skapar skelett Identity. Tjänster för att aktivera dessa funktioner måste läggas till manuellt.

RazorSidor och MVC-byggnadsställningar Identity

ASP.NET Core tillhandahåller ASP.NET Core Identity som ett Razor klassbibliotek (RCL). Program som inkluderar Identity kan använda scaffolder för att selektivt lägga till källkoden som finns i Identity RCL. Du kanske vill generera källkod så att du kan ändra koden och ändra beteendet. Du kan till exempel instruera byggnadsställningen att generera koden som används i registreringen. Identity Anpassad kod åsidosätter standardimplementeringen som tillhandahålls av Identity RCL. Information om hur du får fullständig kontroll över användargränssnittet och inte använder standard-RCL finns i avsnittet Skapa fullständig Identity UI-källa .

Program som inte innehåller autentisering kan använda byggnadsställningen för att lägga till RCL-paketet Identity . Du har möjlighet att välja att Identity kod ska genereras.

Även om scaffolder genererar det mesta av den nödvändiga koden, måste du uppdatera projektet för att slutföra processen. I det här dokumentet beskrivs de steg som krävs för att slutföra en Identity uppdatering av byggnadsställningar.

Vi rekommenderar att du använder ett källkontrollsystem som visar filskillnader och gör att du kan backa från ändringar. Granska ändringarna efter att du har kört Identity-generatorn.

Tjänster krävs när du använder tvåfaktorautentisering, kontobekräftelse och lösenordsåterställning och andra säkerhetsfunktioner med Identity. Tjänster eller tjänststubbar genereras inte när man skapar skelett Identity. Tjänster för att aktivera dessa funktioner måste läggas till manuellt. Se till exempel Kräv e-postbekräftelse.

Normalt bör appar som skapats med enskilda konton inte skapa en ny datakontext.

Bygg Identity in i ett Blazor projekt

Det här avsnittet gäller för Blazor Web Apps och Blazor Server appar.

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Blazor Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till BlazorIdentity :
    • Välj eller lägg till med plusknappen (+) i databaskontextklassen (DbContext-klass).
    • Välj databasprovidern (databasprovidern), som är standard för SQL Server.
    • Välj eller lägg till med plusknappen (+) användarklassen (användarklass).
    • Välj knappen Lägg till.

Den genererade Identity databaskoden kräver EF Core migreringar. Följande steg beskriver hur du skapar och tillämpar en migrering på databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Appar på klientsidan Blazor (fristående Blazor WebAssembly)

Appar på klientsidan Blazor (fristående Blazor WebAssembly) använder sina egna Identity användargränssnittsmetoder och kan inte använda ASP.NET Core-byggnadsställningar Identity .

Mer information finns i Blazor Säkerhet och Identity artiklar.

Skapa en grundstruktur Identity i ett Razor projekt utan befintlig auktorisation

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Migreringar, "UseAuthentication" och layout

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Ändringar i layouten

Valfritt: Lägg till inloggningskomponenten (_LoginPartial) i layoutfilen.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Generera Identity som ett Razor projekt med behörighetshantering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Scaffold Identity till ett MVC-projekt utan befintlig autentisering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Valfritt: Lägg till den partiella inloggningen (_LoginPartial) i Views/Shared/_Layout.cshtml filen:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Lägg till MapRazorPages till Program.cs enligt den markerade koden nedan:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Skapa Identity i ett MVC-projekt med auktorisering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Skapa fullständig Identity användargränssnittskälla

För att behålla fullständig kontroll över Identity-användargränssnittet, kör Identity-verktyget och välj Åsidosätt alla filer.

Lösenordskonfiguration

Om PasswordOptions har konfigurerats i Startup.ConfigureServices, [StringLength]-attributkonfiguration kan vara nödvändig för Password-egenskapen i genererade Identity-sidor. InputModel Password egenskaper finns i följande filer:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Inaktivera sidan

Det här avsnittet visar hur du inaktiverar registersidan, men metoden kan användas för att inaktivera alla sidor.

Så här inaktiverar du användarregistrering:

  • Scaffold Identity. Inkludera Account.Register, Account.Login och Account.RegisterConfirmation. Till exempel:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml.cs så att användarna inte kan registrera sig från den här slutpunkten:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml så att den överensstämmer med föregående ändringar:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Kommentera ut eller ta bort registreringslänken från Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Uppdatera sidan Areas/Identity/Pages/Account/RegisterConfirmation .

    • Ta bort koden och länkarna från cshtml-filen.
    • Ta bort bekräftelsekoden från PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Använda en annan app för att lägga till användare

Ange en mekanism för att lägga till användare utanför webbappen. Alternativ för att lägga till användare är:

  • En dedikerad administratörswebbapp.
  • En konsolapplikation.

Följande kod beskriver en metod för att lägga till användare:

  • En lista över användare läss in i minnet.
  • Ett starkt unikt lösenord genereras för varje användare.
  • Användaren läggs till i Identity databasen.
  • Användaren meddelas och uppmanas att ändra lösenordet.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Följande kod beskriver hur du lägger till en användare:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

En liknande metod kan följas för produktionsscenarier.

Förhindra publicering av statiska Identity tillgångar

Information om hur du kan förhindra att statiska Identity resurser publiceras till webbroten, finns i Introduktion till Identity på ASP.NET Core.

ASP.NET Core tillhandahåller ASP.NET Core Identity som ett Razor klassbibliotek (RCL). Program som inkluderar Identity kan använda scaffolder för att selektivt lägga till källkoden som finns i Identity RCL. Du kanske vill generera källkod så att du kan ändra koden och ändra beteendet. Du kan till exempel instruera byggnadsställningen att generera koden som används i registreringen. Genererad kod har företräde framför samma kod i Identity RCL. Om du vill få fullständig kontroll över användargränssnittet och inte använda standard-RCL läser du avsnittet Skapa fullständig Identity UI-källa.

Program som inte innehåller autentisering kan använda byggnadsställningen för att lägga till RCL-paketet Identity . Du har möjlighet att välja att Identity kod ska genereras.

Även om scaffolder genererar det mesta av den nödvändiga koden, måste du uppdatera projektet för att slutföra processen. I det här dokumentet beskrivs de steg som krävs för att slutföra en Identity uppdatering av byggnadsställningar.

Vi rekommenderar att du använder ett källkontrollsystem som visar filskillnader och gör att du kan backa från ändringar. Granska ändringarna efter att du har kört Identity-generatorn.

Tjänster krävs när du använder tvåfaktorautentisering, kontobekräftelse och lösenordsåterställning och andra säkerhetsfunktioner med Identity. Tjänster eller tjänststubbar genereras inte när man skapar skelett Identity. Tjänster för att aktivera dessa funktioner måste läggas till manuellt. Se till exempel Kräv e-postbekräftelse.

Normalt bör appar som skapats med enskilda konton inte skapa en ny datakontext.

Skapa en grundstruktur Identity i ett Razor projekt utan befintlig auktorisation

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Migreringar, "UseAuthentication" och layout

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Ändringar i layouten

Valfritt: Lägg till inloggningskomponenten (_LoginPartial) i layoutfilen.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Generera Identity som ett Razor projekt med behörighetshantering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Scaffold Identity till ett MVC-projekt utan befintlig autentisering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Valfritt: Lägg till den partiella inloggningen (_LoginPartial) i Views/Shared/_Layout.cshtml filen:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRPnoAuth2Auth</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
    <link rel="stylesheet" href="~/WebRPnoAuth2Auth.styles.css" asp-append-version="true" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRPnoAuth2Auth</a>
                <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                    <partial name="_LoginPartial" />
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2021 - WebRPnoAuth2Auth - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Lägg till MapRazorPages till Program.cs enligt den markerade koden nedan:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebMVCauth.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddControllersWithViews();

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();

app.Run();

Skapa Identity i ett MVC-projekt med auktorisering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Generera ramverket Identity för en server side Blazor app med auktorisering

Installera NuGet-paketet Microsoft.VisualStudio.Web.CodeGeneration.Design .

Anmärkning

Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.


Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Migreringar

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Formatautentiseringsslutpunkter

Eftersom appar på serversidan Blazor använder Razor sidor Identity ändras formateringen av användargränssnittet när en besökare navigerar mellan Identity sidor och komponenter. Du har två alternativ för att åtgärda de osammanhängande stilarna.

Anpassade Identity komponenter

ASP.NET Core Identity är utformat för att fungera i samband med HTTP-begäran och svarskommunikation, som inte är den primära kommunikationsmodellen för klient-server i Blazor appar. ASP.NET Core-appar som använder ASP.NET Core Identity för användarhantering bör använda Razor Pages i stället för Razor komponenter för Identity-relaterade användargränssnitt, till exempel användarregistrering, inloggning, utloggning och andra användarhanteringsuppgifter.

Eftersom SignInManager<TUser> och UserManager<TUser> inte stöds i Razor komponenter rekommenderar vi att du använder webb-API för att hantera Identity åtgärder från Razor komponenter via en serverdelsaktiverad IdentityASP.NET Core-app. Vägledning om hur du skapar webb-API:er för Blazor appar finns i Anropa ett webb-API från en ASP.NET Core-appBlazor.

En metod för att använda Razor komponenter för Identity istället för Razor sidor är att skapa egna anpassade IdentityRazor komponenter, men Microsoft rekommenderar eller stöder inte metoden. Utforska följande diskussioner för ytterligare kontext. I följande diskussioner stöds inte kodexempel i ärendekommentarer och kodexempel som länkas mellan GitHub-lagringsplatser som inte är från Microsoft, men de kan ändå vara till hjälp för vissa utvecklare.

För ytterligare hjälp med att skapa anpassade IdentityRazor komponenter eller söka efter komponenter från tredje part Razor rekommenderar vi följande resurser:

Använd en anpassad layout med Blazor appstilar

Sidlayouten Identity och formatmallarna kan ändras för att skapa sidor som använder format som liknar standardtemat Blazor . Den här metoden omfattas inte av dokumentationen.

Appar på klientsidan Blazor

Appar på klientsidan Blazor använder sina egna Identity användargränssnittstekniker och kan inte använda ASP.NET Core-genereringsverktyg Identity. ASP.NET Core-appar på serversidan med värdbaserade Blazor lösningar kan följa riktlinjerna för Pages/MVC i den Razor här artikeln och konfigureras precis som andra typer av ASP.NET Core-app som stöder Identity.

Ramverket Blazor innehåller Razor inte komponentversioner av Identity användargränssnittssidor. Identity Gränssnittskomponenter Razor kan anpassas eller hämtas från källor från tredje part som inte stöds.

Mer information finns i Blazor Säkerhet och Identity artiklar.

Skapa fullständig Identity användargränssnittskälla

För att behålla fullständig kontroll över Identity-användargränssnittet, kör Identity-verktyget och välj Åsidosätt alla filer.

Lösenordskonfiguration

Om PasswordOptions har konfigurerats i Startup.ConfigureServices, [StringLength]-attributkonfiguration kan vara nödvändig för Password-egenskapen i genererade Identity-sidor. InputModel Password egenskaper finns i följande filer:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Inaktivera sidan

Det här avsnittet visar hur du inaktiverar registersidan, men metoden kan användas för att inaktivera alla sidor.

Så här inaktiverar du användarregistrering:

  • Scaffold Identity. Inkludera Account.Register, Account.Login och Account.RegisterConfirmation. Till exempel:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml.cs så att användarna inte kan registrera sig från den här slutpunkten:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml så att den överensstämmer med föregående ändringar:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Kommentera ut eller ta bort registreringslänken från Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Uppdatera sidan Areas/Identity/Pages/Account/RegisterConfirmation .

    • Ta bort koden och länkarna från cshtml-filen.
    • Ta bort bekräftelsekoden från PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Använda en annan app för att lägga till användare

Ange en mekanism för att lägga till användare utanför webbappen. Alternativ för att lägga till användare är:

  • En dedikerad administratörswebbapp.
  • En konsolapplikation.

Följande kod beskriver en metod för att lägga till användare:

  • En lista över användare läss in i minnet.
  • Ett starkt unikt lösenord genereras för varje användare.
  • Användaren läggs till i Identity databasen.
  • Användaren meddelas och uppmanas att ändra lösenordet.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Följande kod beskriver hur du lägger till en användare:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

En liknande metod kan följas för produktionsscenarier.

Förhindra publicering av statiska Identity tillgångar

Information om hur du kan förhindra att statiska Identity resurser publiceras till webbroten, finns i Introduktion till Identity på ASP.NET Core.

ASP.NET Core tillhandahåller ASP.NET Core Identity som ett Razor klassbibliotek (RCL). Program som inkluderar Identity kan använda scaffolder för att selektivt lägga till källkoden som finns i Identity RCL. Du kanske vill generera källkod så att du kan ändra koden och ändra beteendet. Du kan till exempel instruera byggnadsställningen att generera koden som används i registreringen. Genererad kod har företräde framför samma kod i Identity RCL. Om du vill få fullständig kontroll över användargränssnittet och inte använda standard-RCL läser du avsnittet Skapa fullständig Identity UI-källa.

Program som inte innehåller autentisering kan använda byggnadsställningen för att lägga till RCL-paketet Identity . Du har möjlighet att välja att Identity kod ska genereras.

Även om scaffolder genererar det mesta av den nödvändiga koden, måste du uppdatera projektet för att slutföra processen. I det här dokumentet beskrivs de steg som krävs för att slutföra en Identity uppdatering av byggnadsställningar.

Vi rekommenderar att du använder ett källkontrollsystem som visar filskillnader och gör att du kan backa från ändringar. Granska ändringarna efter att du har kört Identity-generatorn.

Tjänster krävs när du använder tvåfaktorautentisering, kontobekräftelse och lösenordsåterställning och andra säkerhetsfunktioner med Identity. Tjänster eller tjänststubbar genereras inte när man skapar skelett Identity. Tjänster för att aktivera dessa funktioner måste läggas till manuellt. Se till exempel Kräv e-postbekräftelse.

Identity Öppna och ta bort anropen till när du skapar en ny datakontext i ett projekt med befintliga enskilda kontonStartup.ConfigureServices:

  • AddDbContext
  • AddDefaultIdentity

Till exempel AddDbContext och AddDefaultIdentity kommenteras ut i följande kod:

public void ConfigureServices(IServiceCollection services)
{
    //services.AddDbContext<ApplicationDbContext>(options =>
    //    options.UseSqlServer(
    //        Configuration.GetConnectionString("DefaultConnection")));
    //services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    //    .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddControllersWithViews();
    services.AddRazorPages();
}

Föregående kod kommenterar ut koden som dupliceras i Areas/Identity/IdentityHostingStartup.cs

Normalt bör appar som skapats med enskilda konton inte skapa en ny datakontext.

Skapa en grundstruktur Identity i ett tomt projekt

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Startup Uppdatera klassen med kod som liknar följande:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts rekommenderas men krävs inte. Mer information finns i HTTP Strict Transport Security Protocol.

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Skapa en grundstruktur Identity i ett Razor projekt utan befintlig auktorisation

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Identity har konfigurerats i Areas/Identity/IdentityHostingStartup.cs. Mer information finns i IHostingStartup.

Migreringar, "UseAuthentication" och layout

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Aktivera autentisering

Startup Uppdatera klassen med kod som liknar följande:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapRazorPages();
        });
    }
}

UseHsts rekommenderas men krävs inte. Mer information finns i HTTP Strict Transport Security Protocol.

Ändringar i layouten

Valfritt: Lägg till inloggningskomponenten (_LoginPartial) i layoutfilen.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Generera Identity som ett Razor projekt med behörighetshantering

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Vissa Identity alternativ har konfigurerats i Areas/Identity/IdentityHostingStartup.cs. Mer information finns i IHostingStartup.

Scaffold Identity till ett MVC-projekt utan befintlig autentisering

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Valfritt: Lägg till den partiella inloggningen (_LoginPartial) i Views/Shared/_Layout.cshtml filen:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - WebRP</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">WebRP</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <partial name="_LoginPartial" />
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">Privacy</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - WebRP - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Pages/Shared/_LoginPartial.cshtml Flytta filen till Views/Shared/_LoginPartial.cshtml.

Identity har konfigurerats i Areas/Identity/IdentityHostingStartup.cs. Mer information finns i IHostingStartup.

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Startup Uppdatera klassen med kod som liknar följande:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersWithViews();
        services.AddRazorPages();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
            endpoints.MapRazorPages();
        });
    }
}

UseHsts rekommenderas men krävs inte. Mer information finns i HTTP Strict Transport Security Protocol.

Skapa Identity i ett MVC-projekt med auktorisering

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Skapa ett ramverk för Identity i en serverside-app Blazor utan befintligt auktoriseringssystem

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Identity har konfigurerats i Areas/Identity/IdentityHostingStartup.cs. Mer information finns i IHostingStartup.

Migreringar

Den genererade Identity databaskoden kräver Entity Framework (EF) Core Migrations. Om en migrering för att generera Identity schemat inte har skapats och tillämpats på databasen skapar du en migrering och uppdaterar databasen.

Visual Studio Connected Services används för att lägga till en EF Core migrering och uppdatera databasen.

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av Lägg till migrering.

Ge migreringen ett migreringsnamn, till exempel CreateIdentitySchema, som är ett namn som beskriver migreringen. Vänta tills databaskontexten läses in i DbContext-klassnamn fält, vilket kan ta några sekunder. Välj Slutför för att skapa migreringen.

Välj knappen Stäng när åtgärden är klar.

Välj ellipsen (...) igen följt av kommandot Update database.

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Kommandot för att uppdatera databasen kör de Up metodmigreringar som inte har tillämpats i en migreringskodfil som skapats av en kodgenerator. I det här fallet kör Up kommandot -metoden i Migrations/{TIME STAMP}_{MIGRATION NAME}.cs filen, vilket skapar Identity tabeller, begränsningar och index. Platshållaren {TIME STAMP} är en tidsstämpel, och platshållaren {MIGRATION NAME} är namnet på migreringen.

Identity Om schemat redan har skapats men inte tillämpats på databasen måste endast kommandot för att uppdatera databasen köras:

I Solution Explorerdubbelklickar du på Anslutna tjänster. I SQL Server Express LocalDB-områdetför tjänstberoenden väljer du ellipsen (...) följt av kommandot Uppdatera databas .

Dialogrutan Uppdatera databas med den senaste migreringen öppnas. Vänta tills DbContext-klassnamn-fältet uppdateras och tills tidigare migreringar har lästs in, vilket kan ta några sekunder. Välj knappen Slutför .

Välj knappen Stäng när åtgärden är klar.

Du kan kontrollera tillämpningen av ett Identity databas-schema med följande kommando. Kommandots utdata innehåller en "applied" kolumn för att visa vilka migreringar som tillämpas på databasen.

I Visual Studio Package Manager-konsolen ska du köra Get-Migration:

Get-Migration

Om det finns fler än en databaskontext anger du kontexten med parametern -Context .

Formatautentiseringsslutpunkter

Eftersom appar på serversidan Blazor använder Razor sidor Identity ändras formateringen av användargränssnittet när en besökare navigerar mellan Identity sidor och komponenter. Du har två alternativ för att åtgärda de osammanhängande stilarna.

Anpassade Identity komponenter

En metod att använda Identity-komponenter istället för sidor är att skapa Identity-komponenter. Eftersom SignInManager och UserManager inte stöds i Razor komponenter använder du webb-API-slutpunkter i Blazor appen för att bearbeta åtgärder för användarkonton.

Använd en anpassad layout med Blazor appstilar

Sidlayouten Identity och formatmallarna kan ändras för att skapa sidor som använder format som liknar standardtemat Blazor . Den här metoden omfattas inte av dokumentationen.

Generera ramverket Identity för en server side Blazor app med auktorisering

Identity Kör byggnadsställningen:

  • Från Solution Explorer högerklickar du på projektet >Lägg till>nytt skrafferat objekt.
  • I den vänstra rutan i dialogrutan Lägg till nytt autogenererat objekt väljer du Identity. Välj Identity i mittenfönstret. Välj knappen Lägg till.
  • I dialogrutan Lägg till Identity väljer du de alternativ du vill använda.
    • Om du har en befintlig, anpassad layoutsida för Identity (_Layout.cshtml), välj din befintliga layoutsida för att undvika att skriva över layouten med felaktig kod av generatorn. Välj till exempel antingen:
      • Pages/Shared/_Layout.cshtml för Razor sidor eller Blazor Server projekt med befintlig Razor sidinfrastruktur.
      • Views/Shared/_Layout.cshtml för MVC-projekt eller Blazor Server projekt med befintlig MVC-infrastruktur.
    • För datakontexten (DbContext-klassen):
      • Välj din datakontextklass. Du måste välja minst en fil för att lägga till datakontexten.
      • Om du vill skapa en datakontext och eventuellt skapa en ny användarklass för Identityväljer du + knappen . Acceptera standardvärdet eller ange en klass (till exempel Contoso.Data.ApplicationDbContext för ett företag med namnet "Contoso"). Om du vill skapa en ny användarklass väljer du + knappen för Klassen Användare och anger klassen (till exempel ContosoUser för ett företag med namnet "Contoso").
    • Välj knappen Lägg till för att köra byggnadsställningen.

Vissa Identity alternativ har konfigurerats i Areas/Identity/IdentityHostingStartup.cs. Mer information finns i IHostingStartup.

Appar på klientsidan Blazor

Appar på klientsidan Blazor använder sina egna Identity användargränssnittstekniker och kan inte använda ASP.NET Core-genereringsverktyg Identity. ASP.NET Core-appar på serversidan med värdbaserade Blazor lösningar kan följa riktlinjerna för Pages/MVC i den Razor här artikeln och konfigureras precis som andra typer av ASP.NET Core-app som stöder Identity.

Ramverket Blazor innehåller Razor inte komponentversioner av Identity användargränssnittssidor. Identity Gränssnittskomponenter Razor kan anpassas eller hämtas från källor från tredje part som inte stöds.

Mer information finns i Blazor Säkerhet och Identity artiklar.

Skapa fullständig Identity användargränssnittskälla

För att behålla fullständig kontroll över Identity-användargränssnittet, kör Identity-verktyget och välj Åsidosätt alla filer.

Följande markerade kod visar ändringarna för att ersätta standardgränssnittet Identity med Identity i en ASP.NET Core 2.1-webbapp. Du kanske vill göra detta för att ha fullständig kontroll över användargränssnittet Identity .

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<IdentityUser, IdentityRole>()
        // services.AddDefaultIdentity<IdentityUser>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

    services.AddMvc()
        .AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
            options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
        });

    services.ConfigureApplicationCookie(options =>
    {
        options.LoginPath = $"/Identity/Account/Login";
        options.LogoutPath = $"/Identity/Account/Logout";
        options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
    });

    // using Microsoft.AspNetCore.Identity.UI.Services;
    services.AddSingleton<IEmailSender, EmailSender>();
}

Standardvärdet Identity ersätts i följande kod:

services.AddIdentity<IdentityUser, IdentityRole>()
    // services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

Följande kod anger LoginPath, LogoutPath, och AccessDeniedPath):

services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

Registrera en IEmailSender implementering, till exempel:

// using Microsoft.AspNetCore.Identity.UI.Services;
services.AddSingleton<IEmailSender, EmailSender>();
public class EmailSender : IEmailSender
{
    public Task SendEmailAsync(string email, string subject, string message)
    {
        return Task.CompletedTask;
    }
}

Lösenordskonfiguration

Om PasswordOptions har konfigurerats i Startup.ConfigureServices, [StringLength]-attributkonfiguration kan vara nödvändig för Password-egenskapen i genererade Identity-sidor. InputModel Password egenskaper finns i följande filer:

  • Areas/Identity/Pages/Account/Register.cshtml.cs
  • Areas/Identity/Pages/Account/ResetPassword.cshtml.cs

Inaktivera sidan

Det här avsnittet visar hur du inaktiverar registersidan, men metoden kan användas för att inaktivera alla sidor.

Så här inaktiverar du användarregistrering:

  • Scaffold Identity. Inkludera Account.Register, Account.Login och Account.RegisterConfirmation. Till exempel:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml.cs så att användarna inte kan registrera sig från den här slutpunkten:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Uppdatera Areas/Identity/Pages/Account/Register.cshtml så att den överensstämmer med föregående ändringar:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
  • Kommentera ut eller ta bort registreringslänken från Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Uppdatera sidan Areas/Identity/Pages/Account/RegisterConfirmation .

    • Ta bort koden och länkarna från cshtml-filen.
    • Ta bort bekräftelsekoden från PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Använda en annan app för att lägga till användare

Ange en mekanism för att lägga till användare utanför webbappen. Alternativ för att lägga till användare är:

  • En dedikerad administratörswebbapp.
  • En konsolapplikation.

Följande kod beskriver en metod för att lägga till användare:

  • En lista över användare läss in i minnet.
  • Ett starkt unikt lösenord genereras för varje användare.
  • Användaren läggs till i Identity databasen.
  • Användaren meddelas och uppmanas att ändra lösenordet.
public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<AppDbCntx>();
                context.Database.Migrate();

                var config = host.Services.GetRequiredService<IConfiguration>();
                var userList = config.GetSection("userList").Get<List<string>>();

                SeedData.Initialize(services, userList).Wait();
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred adding users.");
            }
        }

        host.Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

Följande kod beskriver hur du lägger till en användare:


public static async Task Initialize(IServiceProvider serviceProvider,
                                    List<string> userList)
{
    var userManager = serviceProvider.GetService<UserManager<IdentityUser>>();

    foreach (var userName in userList)
    {
        var userPassword = GenerateSecurePassword();
        var userId = await EnsureUser(userManager, userName, userPassword);

        NotifyUser(userName, userPassword);
    }
}

private static async Task<string> EnsureUser(UserManager<IdentityUser> userManager,
                                             string userName, string userPassword)
{
    var user = await userManager.FindByNameAsync(userName);

    if (user == null)
    {
        user = new IdentityUser(userName)
        {
            EmailConfirmed = true
        };
        await userManager.CreateAsync(user, userPassword);
    }

    return user.Id;
}

En liknande metod kan följas för produktionsscenarier.

Förhindra publicering av statiska Identity tillgångar

Information om hur du kan förhindra att statiska Identity resurser publiceras till webbroten, finns i Introduktion till Identity på ASP.NET Core.

Ytterligare resurser

Ändringar i autentiseringskod till ASP.NET Core 2.1 eller senare