Perancah Identity dalam proyek ASP.NET Core

Oleh Rick Anderson

ASP.NET Core menyediakan ASP.NET Core Identity sebagai Razor Pustaka Kelas. Aplikasi yang menyertakan Identity dapat menerapkan perancah untuk secara selektif menambahkan kode sumber yang terkandung dalam IdentityRazor Pustaka Kelas (RCL). Anda mungkin ingin membuat kode sumber sehingga Anda dapat mengubah kode dan mengubah perilaku. Misalnya, Anda dapat menginstruksikan perancah untuk menghasilkan kode yang digunakan dalam pendaftaran. Kode yang dihasilkan lebih diutamakan daripada kode yang sama dalam Identity RCL. Untuk mendapatkan kontrol penuh atas UI dan tidak menggunakan RCL default, lihat bagian Membuat sumber UI penuhIdentity.

Aplikasi yang tidak menyertakan autentikasi dapat menerapkan perancah untuk menambahkan paket RCLIdentity. Anda memiliki opsi untuk memilih Identity kode yang akan dibuat.

Meskipun perancah menghasilkan sebagian besar kode yang diperlukan, Anda perlu memperbarui proyek Anda untuk menyelesaikan proses. Dokumen ini menjelaskan langkah-langkah yang Identity diperlukan untuk menyelesaikan pembaruan perancah.

Sebaiknya gunakan sistem kontrol sumber yang menunjukkan perbedaan file dan memungkinkan Anda untuk mundur dari perubahan. Periksa perubahan setelah menjalankan Identity perancah.

Layanan diperlukan saat menggunakan Autentikasi Dua Faktor, Konfirmasi akun dan pemulihan kata sandi, dan fitur keamanan lainnya dengan Identity. Layanan atau stub layanan tidak dihasilkan saat perancah Identity. Layanan untuk mengaktifkan fitur ini harus ditambahkan secara manual. Misalnya, lihat Memerlukan Konfirmasi Email.

Biasanya, aplikasi yang dibuat dengan akun individual tidak boleh membuat konteks data baru.

Perancah Identity ke dalam Razor proyek tanpa otorisasi yang ada

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Migrasi, UseAuthentication, dan tata letak

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Perubahan tata letak

Opsional: Tambahkan parsial login (_LoginPartial) ke file tata letak:

<!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>

Perancah Identity ke dalam Razor proyek dengan otorisasi

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Perancah Identity ke dalam proyek MVC tanpa otorisasi yang ada

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Opsional: Tambahkan parsial login (_LoginPartial) ke Views/Shared/_Layout.cshtml file:

<!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>

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Tambahkan MapRazorPages ke Program.cs seperti yang ditunjukkan dalam kode yang disorot berikut:

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();

Perancah Identity ke dalam proyek MVC dengan otorisasi

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Aplikasi sisi Blazor klien

Aplikasi sisi Blazor klien menggunakan pendekatan UI mereka sendiri Identity dan tidak dapat menggunakan perancah ASP.NET Core Identity .

Aplikasi ASP.NET Core sisi server dapat mengikuti Razor panduan Pages/MVC dalam artikel ini dan dikonfigurasi sama seperti jenis aplikasi ASP.NET Core lainnya yang mendukung Identity. Blazor Kerangka kerja menggunakan Razor versi komponen (.razor) Identity halaman UI (.cshtml) saat perancah Identity ke dalam Blazor Aplikasi Web.

Untuk informasi selengkapnya, lihat Blazor Artikel dan IdentityKeamanan.

Membuat sumber UI lengkap Identity

Untuk mempertahankan kontrol Identity penuh UI, jalankan Identity perancah dan pilih Ambil alih semua file.

Konfigurasi kata sandi

Jika PasswordOptions dikonfigurasi dalam Startup.ConfigureServices, [StringLength] konfigurasi atribut mungkin diperlukan untuk Password properti di halaman perancah Identity . InputModelPassword properti ditemukan dalam file berikut:

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

Menonaktifkan halaman

Bagian ini menunjukkan cara menonaktifkan halaman register tetapi pendekatan dapat digunakan untuk menonaktifkan halaman apa pun.

Untuk menonaktifkan pendaftaran pengguna:

  • Perancah Identity. Sertakan Account.Register, Account.Login, dan Account.RegisterConfirmation. Misalnya:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml.cs sehingga pengguna tidak dapat mendaftar dari titik akhir ini:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml agar konsisten dengan perubahan sebelumnya:

    @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>
    
  • Mengomentari atau menghapus tautan pendaftaran dari Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Perbarui halaman Area/Identity/Halaman/Akun/RegisterKonfirmasi .

    • Hapus kode dan tautan dari file cshtml.
    • Hapus kode konfirmasi dari PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Menggunakan aplikasi lain untuk menambahkan pengguna

Berikan mekanisme untuk menambahkan pengguna di luar aplikasi web. Opsi untuk menambahkan pengguna meliputi:

  • Aplikasi web admin khusus.
  • Aplikasi konsol.

Kode berikut menguraikan satu pendekatan untuk menambahkan pengguna:

  • Daftar pengguna dibaca ke dalam memori.
  • Kata sandi unik yang kuat dihasilkan untuk setiap pengguna.
  • Pengguna ditambahkan ke Identity database.
  • Pengguna diberi tahu dan diberitahu untuk mengubah kata sandi.
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>();
            });
}

Kode berikut menguraikan penambahan pengguna:


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

Pendekatan serupa dapat diikuti untuk skenario produksi.

Mencegah penerbitan aset statis Identity

Untuk mencegah penerbitan aset statis Identity ke akar web, lihat Pengenalan Identity ASP.NET Core.

ASP.NET Core menyediakan ASP.NET Core Identity sebagai Razor Pustaka Kelas. Aplikasi yang menyertakan Identity dapat menerapkan perancah untuk secara selektif menambahkan kode sumber yang terkandung dalam IdentityRazor Pustaka Kelas (RCL). Anda mungkin ingin membuat kode sumber sehingga Anda dapat mengubah kode dan mengubah perilaku. Misalnya, Anda dapat menginstruksikan perancah untuk menghasilkan kode yang digunakan dalam pendaftaran. Kode yang dihasilkan lebih diutamakan daripada kode yang sama dalam Identity RCL. Untuk mendapatkan kontrol penuh atas UI dan tidak menggunakan RCL default, lihat bagian Membuat sumber UI penuhIdentity.

Aplikasi yang tidak menyertakan autentikasi dapat menerapkan perancah untuk menambahkan paket RCLIdentity. Anda memiliki opsi untuk memilih Identity kode yang akan dibuat.

Meskipun perancah menghasilkan sebagian besar kode yang diperlukan, Anda perlu memperbarui proyek Anda untuk menyelesaikan proses. Dokumen ini menjelaskan langkah-langkah yang Identity diperlukan untuk menyelesaikan pembaruan perancah.

Sebaiknya gunakan sistem kontrol sumber yang menunjukkan perbedaan file dan memungkinkan Anda untuk mundur dari perubahan. Periksa perubahan setelah menjalankan Identity perancah.

Layanan diperlukan saat menggunakan Autentikasi Dua Faktor, Konfirmasi akun dan pemulihan kata sandi, dan fitur keamanan lainnya dengan Identity. Layanan atau stub layanan tidak dihasilkan saat perancah Identity. Layanan untuk mengaktifkan fitur ini harus ditambahkan secara manual. Misalnya, lihat Memerlukan Konfirmasi Email.

Biasanya, aplikasi yang dibuat dengan akun individual tidak boleh membuat konteks data baru.

Perancah Identity ke dalam Razor proyek tanpa otorisasi yang ada

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Migrasi, UseAuthentication, dan tata letak

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Perubahan tata letak

Opsional: Tambahkan parsial login (_LoginPartial) ke file tata letak:

<!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>

Perancah Identity ke dalam Razor proyek dengan otorisasi

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Perancah Identity ke dalam proyek MVC tanpa otorisasi yang ada

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Opsional: Tambahkan parsial login (_LoginPartial) ke Views/Shared/_Layout.cshtml file:

<!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>

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Tambahkan MapRazorPages ke Program.cs seperti yang ditunjukkan dalam kode yang disorot berikut:

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();

Perancah Identity ke dalam proyek MVC dengan otorisasi

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Perancah Identity ke dalam aplikasi sisi Blazor server dengan otorisasi

Instal paket NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design.

Catatan

Untuk panduan tentang menambahkan paket ke aplikasi .NET, lihat artikel di bagian Menginstal dan mengelola paket di Alur kerja konsumsi paket (dokumentasi NuGet). Konfirmasikan versi paket yang benar di NuGet.org.


Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Migrasi

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Titik akhir autentikasi gaya

Karena aplikasi sisi Blazor server menggunakan Razor halaman Pages Identity , gaya UI berubah saat pengunjung menavigasi antara Identity halaman dan komponen. Anda memiliki dua opsi untuk mengatasi gaya inkongruous:

Komponen kustom Identity

ASP.NET Core Identity dirancang untuk bekerja dalam konteks permintaan HTTP dan komunikasi respons, yang bukan model komunikasi server klien utama dalam Blazor aplikasi. Aplikasi ASP.NET Core yang menggunakan ASP.NET Core Identity untuk manajemen pengguna harus menggunakan Halaman Razor, bukan komponen Razor untuk UI terkait Identity, seperti pendaftaran pengguna, masuk, keluar, dan tugas manajemen pengguna lainnya.

Karena SignInManager<TUser> dan UserManager<TUser> tidak didukung dalam Razor komponen, sebaiknya gunakan API web untuk mengelola Identity tindakan dari Razor komponen melalui aplikasi ASP.NET Core yang diaktifkan sisi Identityserver. Untuk panduan tentang membuat API web untuk Blazor aplikasi, lihat Memanggil API web dari aplikasi ASP.NET CoreBlazor.

Pendekatan untuk menggunakan Razor komponen alih-alih IdentityRazor halaman adalah membangun komponen kustom IdentityRazor Anda sendiri, tetapi Microsoft tidak merekomendasikan atau mendukung pendekatan tersebut. Untuk konteks tambahan, jelajahi diskusi berikut. Dalam diskusi berikut, contoh kode dalam komentar masalah dan contoh kode yang ditautkan silang di repositori GitHub non-Microsoft tidak didukung oleh Microsoft tetapi mungkin berguna bagi beberapa pengembang:

Untuk bantuan tambahan saat berusaha membangun komponen kustom IdentityRazor atau mencari komponen pihak Razor ketiga, kami merekomendasikan sumber daya berikut:

Menggunakan tata letak kustom dengan Blazor gaya aplikasi

Tata Identity letak dan gaya halaman dapat dimodifikasi untuk menghasilkan halaman yang menggunakan gaya yang mirip dengan tema default Blazor . Pendekatan ini tidak tercakup dalam dokumentasi.

Aplikasi sisi Blazor klien

Aplikasi sisi Blazor klien menggunakan pendekatan UI mereka sendiri Identity dan tidak dapat menggunakan perancah ASP.NET Core Identity . Aplikasi sisi server ASP.NET Core dari solusi yang dihosting Blazor dapat mengikuti Razor panduan Pages/MVC dalam artikel ini dan dikonfigurasi sama seperti jenis aplikasi ASP.NET Core lainnya yang mendukung Identity.

Blazor Kerangka kerja tidak menyertakan Razor versi Identity komponen halaman UI. Identity Komponen UI Razor dapat dibuat khusus atau diperoleh dari sumber pihak ketiga yang tidak didukung.

Untuk informasi selengkapnya, lihat Blazor Artikel dan IdentityKeamanan.

Membuat sumber UI lengkap Identity

Untuk mempertahankan kontrol Identity penuh UI, jalankan Identity perancah dan pilih Ambil alih semua file.

Konfigurasi kata sandi

Jika PasswordOptions dikonfigurasi dalam Startup.ConfigureServices, [StringLength] konfigurasi atribut mungkin diperlukan untuk Password properti di halaman perancah Identity . InputModelPassword properti ditemukan dalam file berikut:

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

Menonaktifkan halaman

Bagian ini menunjukkan cara menonaktifkan halaman register tetapi pendekatan dapat digunakan untuk menonaktifkan halaman apa pun.

Untuk menonaktifkan pendaftaran pengguna:

  • Perancah Identity. Sertakan Account.Register, Account.Login, dan Account.RegisterConfirmation. Misalnya:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml.cs sehingga pengguna tidak dapat mendaftar dari titik akhir ini:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml agar konsisten dengan perubahan sebelumnya:

    @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>
    
  • Mengomentari atau menghapus tautan pendaftaran dari Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Perbarui halaman Area/Identity/Halaman/Akun/RegisterKonfirmasi .

    • Hapus kode dan tautan dari file cshtml.
    • Hapus kode konfirmasi dari PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Menggunakan aplikasi lain untuk menambahkan pengguna

Berikan mekanisme untuk menambahkan pengguna di luar aplikasi web. Opsi untuk menambahkan pengguna meliputi:

  • Aplikasi web admin khusus.
  • Aplikasi konsol.

Kode berikut menguraikan satu pendekatan untuk menambahkan pengguna:

  • Daftar pengguna dibaca ke dalam memori.
  • Kata sandi unik yang kuat dihasilkan untuk setiap pengguna.
  • Pengguna ditambahkan ke Identity database.
  • Pengguna diberi tahu dan diberitahu untuk mengubah kata sandi.
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>();
            });
}

Kode berikut menguraikan penambahan pengguna:


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

Pendekatan serupa dapat diikuti untuk skenario produksi.

Mencegah penerbitan aset statis Identity

Untuk mencegah penerbitan aset statis Identity ke akar web, lihat Pengenalan Identity ASP.NET Core.

ASP.NET Core menyediakan ASP.NET Core Identity sebagai Razor Pustaka Kelas. Aplikasi yang menyertakan Identity dapat menerapkan perancah untuk secara selektif menambahkan kode sumber yang terkandung dalam IdentityRazor Pustaka Kelas (RCL). Anda mungkin ingin membuat kode sumber sehingga Anda dapat mengubah kode dan mengubah perilaku. Misalnya, Anda dapat menginstruksikan perancah untuk menghasilkan kode yang digunakan dalam pendaftaran. Kode yang dihasilkan lebih diutamakan daripada kode yang sama dalam Identity RCL. Untuk mendapatkan kontrol penuh atas UI dan tidak menggunakan RCL default, lihat bagian Membuat sumber UI penuhIdentity.

Aplikasi yang tidak menyertakan autentikasi dapat menerapkan perancah untuk menambahkan paket RCLIdentity. Anda memiliki opsi untuk memilih Identity kode yang akan dibuat.

Meskipun perancah menghasilkan sebagian besar kode yang diperlukan, Anda perlu memperbarui proyek Anda untuk menyelesaikan proses. Dokumen ini menjelaskan langkah-langkah yang Identity diperlukan untuk menyelesaikan pembaruan perancah.

Sebaiknya gunakan sistem kontrol sumber yang menunjukkan perbedaan file dan memungkinkan Anda untuk mundur dari perubahan. Periksa perubahan setelah menjalankan Identity perancah.

Layanan diperlukan saat menggunakan Autentikasi Dua Faktor, Konfirmasi akun dan pemulihan kata sandi, dan fitur keamanan lainnya dengan Identity. Layanan atau stub layanan tidak dihasilkan saat perancah Identity. Layanan untuk mengaktifkan fitur ini harus ditambahkan secara manual. Misalnya, lihat Memerlukan Konfirmasi Email.

Saat perancah Identity dengan konteks data baru ke dalam proyek dengan akun individual yang ada:

  • Di Startup.ConfigureServices, hapus panggilan ke:
    • AddDbContext
    • AddDefaultIdentity

Misalnya, AddDbContext dan AddDefaultIdentity dikomentari dalam kode berikut:

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

Kode sebelumnya mengomentari kode yang diduplikasi di Areas/Identity/IdentityHostingStartup.cs

Biasanya, aplikasi yang dibuat dengan akun individual tidak boleh membuat konteks data baru.

Perancah Identity ke dalam proyek kosong

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Startup Perbarui kelas dengan kode yang mirip dengan yang berikut ini:

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 disarankan tetapi tidak diperlukan. Untuk informasi selengkapnya, lihat Protokol Keamanan Transportasi Ketat HTTP.

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Perancah Identity ke dalam Razor proyek tanpa otorisasi yang ada

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Identity dikonfigurasi di Areas/Identity/IdentityHostingStartup.cs. Untuk informasi selengkapnya, lihat IHostingStartup.

Migrasi, UseAuthentication, dan tata letak

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Aktifkan autentikasi

Startup Perbarui kelas dengan kode yang mirip dengan yang berikut ini:

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 disarankan tetapi tidak diperlukan. Untuk informasi selengkapnya, lihat Protokol Keamanan Transportasi Ketat HTTP.

Perubahan tata letak

Opsional: Tambahkan parsial login (_LoginPartial) ke file tata letak:

<!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>

Perancah Identity ke dalam Razor proyek dengan otorisasi

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Beberapa Identity opsi dikonfigurasi di Areas/Identity/IdentityHostingStartup.cs. Untuk informasi selengkapnya, lihat IHostingStartup.

Perancah Identity ke dalam proyek MVC tanpa otorisasi yang ada

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Opsional: Tambahkan parsial login (_LoginPartial) ke Views/Shared/_Layout.cshtml file:

<!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>
  • Pindahkan file ke Pages/Shared/_LoginPartial.cshtmlViews/Shared/_LoginPartial.cshtml

Identity dikonfigurasi di Areas/Identity/IdentityHostingStartup.cs. Untuk informasi selengkapnya, lihat IHostingStartup.

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Startup Perbarui kelas dengan kode yang mirip dengan yang berikut ini:

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 disarankan tetapi tidak diperlukan. Untuk informasi selengkapnya, lihat Protokol Keamanan Transportasi Ketat HTTP.

Perancah Identity ke dalam proyek MVC dengan otorisasi

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Perancah Identity ke dalam aplikasi sisi Blazor server tanpa otorisasi yang ada

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Identity dikonfigurasi di Areas/Identity/IdentityHostingStartup.cs. Untuk informasi selengkapnya, lihat IHostingStartup .

Migrasi

Kode database yang dihasilkan Identity memerlukan Migrasi Inti Kerangka Kerja Entitas. Jika migrasi untuk membuat Identity skema belum dibuat dan diterapkan ke database, buat migrasi dan perbarui database. Misalnya, jalankan perintah berikut:

Di Konsol Manajer Paket Visual Studio:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Add-Migration CreateIdentitySchema
Update-Database

Parameter nama "BuatIdentitySkema" untuk Add-Migration perintah bersifat semena-mena. "CreateIdentitySchema" menjelaskan migrasi.

Identity Jika skema telah dibuat tetapi tidak diterapkan ke database, hanya perintah untuk memperbarui database yang harus dijalankan:

Di Konsol Manajer Paket Visual Studio, jalankan Update-Database:

Update-Database

Anda dapat mengonfirmasi aplikasi Identity skema dengan perintah berikut. Output perintah menyertakan kolom "applied" untuk menunjukkan migrasi mana yang diterapkan ke database.

Di Konsol Manajer Paket Visual Studio, jalankan Get-Migration:

Get-Migration

Jika ada lebih dari satu konteks database, tentukan konteks dengan -Context parameter .

Titik akhir autentikasi gaya

Karena aplikasi sisi Blazor server menggunakan Razor halaman Pages Identity , gaya UI berubah saat pengunjung menavigasi antara Identity halaman dan komponen. Anda memiliki dua opsi untuk mengatasi gaya inkongruous:

Komponen kustom Identity

Pendekatan untuk menggunakan komponen alih-alih Identity halaman adalah membangun Identity komponen. Karena SignInManager dan UserManager tidak didukung dalam Razor komponen, gunakan titik akhir API web di Blazor aplikasi untuk memproses tindakan akun pengguna.

Menggunakan tata letak kustom dengan Blazor gaya aplikasi

Tata Identity letak dan gaya halaman dapat dimodifikasi untuk menghasilkan halaman yang menggunakan gaya yang mirip dengan tema default Blazor . Pendekatan ini tidak tercakup dalam dokumentasi.

Perancah Identity ke dalam aplikasi sisi Blazor server dengan otorisasi

Jalankan Identity perancah:

  • Dari Penjelajah Solusi, klik kanan proyek >Tambahkan>Item Perancah Baru.
  • Dari panel kiri dialog Tambahkan Item Perancah Baru, pilih Identity. Pilih Identity di panel tengah. Pilih tombol Tambahkan.
  • Dalam dialog TambahkanIdentity, pilih opsi yang Anda inginkan.
    • Jika Anda memiliki halaman tata letak yang sudah ada dan dikustomisasi untuk Identity (_Layout.cshtml), pilih halaman tata letak yang ada untuk menghindari penimpaan tata letak Anda dengan markup yang salah oleh perancah. Misalnya, pilih:
      • Pages/Shared/_Layout.cshtml untuk Razor Halaman atau Blazor Server proyek dengan infrastruktur Halaman yang Razor sudah ada.
      • Views/Shared/_Layout.cshtml untuk proyek atau Blazor Server proyek MVC dengan infrastruktur MVC yang ada.
    • Untuk konteks data (kelas DbContext):
      • Pilih kelas konteks data Anda. Anda harus memilih setidaknya satu file untuk menambahkan konteks data Anda.
      • Untuk membuat konteks data dan mungkin membuat kelas pengguna baru untuk Identity, pilih tombol + . Terima nilai default atau tentukan kelas (misalnya, Contoso.Data.ApplicationDbContext untuk perusahaan bernama "Contoso"). Untuk membuat kelas pengguna baru, pilih tombol + untuk Kelas pengguna dan tentukan kelas (misalnya, ContosoUser untuk perusahaan bernama "Contoso").
    • Pilih tombol Tambahkan untuk menjalankan perancah.

Beberapa Identity opsi dikonfigurasi di Areas/Identity/IdentityHostingStartup.cs. Untuk informasi selengkapnya, lihat IHostingStartup.

Aplikasi sisi Blazor klien

Aplikasi sisi Blazor klien menggunakan pendekatan UI mereka sendiri Identity dan tidak dapat menggunakan perancah ASP.NET Core Identity . Aplikasi sisi server ASP.NET Core dari solusi yang dihosting Blazor dapat mengikuti Razor panduan Pages/MVC dalam artikel ini dan dikonfigurasi sama seperti jenis aplikasi ASP.NET Core lainnya yang mendukung Identity.

Blazor Kerangka kerja tidak menyertakan Razor versi Identity komponen halaman UI. Identity Komponen UI Razor dapat dibuat khusus atau diperoleh dari sumber pihak ketiga yang tidak didukung.

Untuk informasi selengkapnya, lihat Blazor Artikel dan IdentityKeamanan.

Membuat sumber UI lengkap Identity

Untuk mempertahankan kontrol Identity penuh UI, jalankan Identity perancah dan pilih Ambil alih semua file.

Kode yang disorot berikut menunjukkan perubahan untuk mengganti UI default Identity dengan Identity di aplikasi web ASP.NET Core 2.1. Anda mungkin ingin melakukan ini untuk memiliki kontrol penuh atas Identity UI.

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

Default Identity diganti dalam kode berikut:

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

Kode berikut menetapkan LoginPath, , LogoutPathdan AccessDeniedPath):

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

IEmailSender Daftarkan implementasi, misalnya:

// 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;
    }
}

Konfigurasi kata sandi

Jika PasswordOptions dikonfigurasi dalam Startup.ConfigureServices, [StringLength] konfigurasi atribut mungkin diperlukan untuk Password properti di halaman perancah Identity . InputModelPassword properti ditemukan dalam file berikut:

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

Menonaktifkan halaman

Bagian ini menunjukkan cara menonaktifkan halaman register tetapi pendekatan dapat digunakan untuk menonaktifkan halaman apa pun.

Untuk menonaktifkan pendaftaran pengguna:

  • Perancah Identity. Sertakan Account.Register, Account.Login, dan Account.RegisterConfirmation. Misalnya:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml.cs sehingga pengguna tidak dapat mendaftar dari titik akhir ini:

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Pembaruan Areas/Identity/Pages/Account/Register.cshtml agar konsisten dengan perubahan sebelumnya:

    @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>
    
  • Mengomentari atau menghapus tautan pendaftaran dari Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Perbarui halaman Area/Identity/Halaman/Akun/RegisterKonfirmasi .

    • Hapus kode dan tautan dari file cshtml.
    • Hapus kode konfirmasi dari PageModel:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Menggunakan aplikasi lain untuk menambahkan pengguna

Berikan mekanisme untuk menambahkan pengguna di luar aplikasi web. Opsi untuk menambahkan pengguna meliputi:

  • Aplikasi web admin khusus.
  • Aplikasi konsol.

Kode berikut menguraikan satu pendekatan untuk menambahkan pengguna:

  • Daftar pengguna dibaca ke dalam memori.
  • Kata sandi unik yang kuat dihasilkan untuk setiap pengguna.
  • Pengguna ditambahkan ke Identity database.
  • Pengguna diberi tahu dan diberitahu untuk mengubah kata sandi.
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>();
            });
}

Kode berikut menguraikan penambahan pengguna:


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

Pendekatan serupa dapat diikuti untuk skenario produksi.

Mencegah penerbitan aset statis Identity

Untuk mencegah penerbitan aset statis Identity ke akar web, lihat Pengenalan Identity ASP.NET Core.

Sumber daya tambahan