ASP.NET Core projelerinde iskele Identity

Gönderen Rick Anderson

ASP.NET Core, Sınıf Kitaplığı olarak ASP.NET Core Identity sağlar.Razor İçeren Identity uygulamalar, Sınıf Kitaplığı'nda (RCL) bulunan kaynak kodunu seçmeli olarak eklemek için iskeleyi IdentityRazor uygulayabilir. Kodu değiştirmek ve davranışı değiştirmek için kaynak kodu oluşturmak isteyebilirsiniz. Örneğin, yapı iskelesine kayıtta kullanılan kodu oluşturmasını söyleyebilirsiniz. Oluşturulan kod, RCL'deki aynı koddan Identity önceliklidir. Kullanıcı arabiriminin tam denetimini elde etmek ve varsayılan RCL'yi kullanmamak için Tam Identity kullanıcı arabirimi kaynağı oluşturma bölümüne bakın.

Kimlik doğrulaması içermeyen uygulamalar RCL Identity paketini eklemek için iskeleyi uygulayabilir. Oluşturulacak kodu seçme Identity seçeneğiniz vardır.

yapı iskelesi gerekli kodun çoğunu oluştursa da, işlemi tamamlamak için projenizi güncelleştirmeniz gerekir. Bu belgede bir Identity iskele güncelleştirmesini tamamlamak için gereken adımlar açıklanmaktadır.

Dosya farklarını gösteren ve değişiklikleri geri almanızı sağlayan bir kaynak denetim sistemi kullanmanızı öneririz. yapı iskelesini çalıştırdıktan Identity sonra değişiklikleri inceleyin.

İki Faktörlü Kimlik Doğrulaması, Hesap onayı ve parola kurtarma ve ile Identitydiğer güvenlik özellikleri kullanılırken hizmetler gereklidir. yapı iskelesi Identityoluşturulurken hizmetler veya hizmet saptamaları oluşturulmaz. Bu özellikleri etkinleştirmek için hizmetlerin el ile eklenmesi gerekir. Örneğin, bkz . E-posta Onayı Gerektir.

Genellikle, tek tek hesaplarla oluşturulan uygulamalar yeni bir veri bağlamı oluşturmamalıdır.

Mevcut yetkilendirme olmadan bir Razor projeye iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Geçişler, UseAuthentication ve düzen

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Düzen değişiklikleri

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini düzen dosyasına ekleyin:

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

Yetkilendirmeli bir Razor projeye iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Mevcut yetkilendirme olmadan bir MVC projesine iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini dosyaya Views/Shared/_Layout.cshtml ekleyin:

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

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Aşağıdaki vurgulanmış kodda gösterildiği gibi öğesini Program.cs ekleyinMapRazorPages:

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

Yetkilendirmeli bir MVC projesine iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

İstemci tarafı Blazor uygulamaları

İstemci tarafı Blazor uygulamaları kendi Identity kullanıcı arabirimi yaklaşımlarını kullanır ve ASP.NET Core Identity iskelesini kullanamaz.

Sunucu tarafı ASP.NET Core uygulamaları bu makaledeki Razor Pages/MVC yönergelerini izleyebilir ve destekleyen Identitydiğer ASP.NET Core uygulamaları gibi yapılandırılır. Çerçeve, Blazor web Blazor uygulamasına yapı iskelesi Identity oluştururken kullanıcı arabirimi sayfalarının Identity () bileşen sürümlerini.razor (.cshtml) kullanırRazor.

Daha fazla bilgi için Güvenlik ve makalelere Blazor bakın.Identity

Tam Identity kullanıcı arabirimi kaynağı oluşturma

Kullanıcı arabiriminin Identity tam denetimini korumak için iskeleyi Identity çalıştırın ve Tüm dosyaları geçersiz kıl'ı seçin.

Parola yapılandırması

içinde Startup.ConfigureServicesyapılandırıldıysaPasswordOptions,[StringLength]yapı iskelesi sayfalarındaki Identity özellik için Password öznitelik yapılandırması gerekebilir. InputModelPassword özellikleri aşağıdaki dosyalarda bulunur:

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

Sayfayı devre dışı bırakma

Bu bölümde yazmaç sayfasının nasıl devre dışı bırakılacağı gösterilmektedir, ancak herhangi bir sayfayı devre dışı bırakmak için bu yaklaşım kullanılabilir.

Kullanıcı kaydını devre dışı bırakmak için:

  • yapı iskelesi Identity. Account.Register, Account.Login ve Account.RegisterConfirmation bilgilerini ekleyin. Örneğin:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Kullanıcıların bu uç noktadan kaydolmaması için güncelleştirin Areas/Identity/Pages/Account/Register.cshtml.cs :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Önceki değişikliklerle tutarlı olacak şekilde güncelleştirin Areas/Identity/Pages/Account/Register.cshtml :

    @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>
    
  • Kayıt bağlantısını açıklama satırı veya kaldırma Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Alanlar//Sayfalar/IdentityHesap/RegisterConfirmation sayfasını güncelleştirin.

    • Cshtml dosyasından kodu ve bağlantıları kaldırın.
    • onay kodunu içinden PageModelkaldırın:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Kullanıcı eklemek için başka bir uygulama kullanma

Web uygulamasının dışına kullanıcı eklemek için bir mekanizma sağlayın. Kullanıcı ekleme seçenekleri şunlardır:

  • Ayrılmış bir yönetici web uygulaması.
  • Konsol uygulaması.

Aşağıdaki kodda kullanıcı eklemeye yönelik bir yaklaşım özetlenmiştir:

  • Kullanıcıların listesi belleğe okunur.
  • Her kullanıcı için güçlü bir benzersiz parola oluşturulur.
  • Kullanıcı veritabanına eklenir Identity .
  • Kullanıcıya bildirim gönderilir ve parolayı değiştirmesi bildirilir.
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>();
            });
}

Aşağıdaki kod, kullanıcı eklemeyi özetler:


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

Üretim senaryoları için de benzer bir yaklaşım izlenebilir.

Statik Identity varlıkların yayımlanmasını engelleme

Statik Identity varlıkların web kökünde yayımlanmasını önlemek için bkz. ASP.NET Core'da Identitygiriş.

ASP.NET Core, Sınıf Kitaplığı olarak ASP.NET Core Identity sağlar.Razor İçeren Identity uygulamalar, Sınıf Kitaplığı'nda (RCL) bulunan kaynak kodunu seçmeli olarak eklemek için iskeleyi IdentityRazor uygulayabilir. Kodu değiştirmek ve davranışı değiştirmek için kaynak kodu oluşturmak isteyebilirsiniz. Örneğin, yapı iskelesine kayıtta kullanılan kodu oluşturmasını söyleyebilirsiniz. Oluşturulan kod, RCL'deki aynı koddan Identity önceliklidir. Kullanıcı arabiriminin tam denetimini elde etmek ve varsayılan RCL'yi kullanmamak için Tam Identity kullanıcı arabirimi kaynağı oluşturma bölümüne bakın.

Kimlik doğrulaması içermeyen uygulamalar RCL Identity paketini eklemek için iskeleyi uygulayabilir. Oluşturulacak kodu seçme Identity seçeneğiniz vardır.

yapı iskelesi gerekli kodun çoğunu oluştursa da, işlemi tamamlamak için projenizi güncelleştirmeniz gerekir. Bu belgede bir Identity iskele güncelleştirmesini tamamlamak için gereken adımlar açıklanmaktadır.

Dosya farklarını gösteren ve değişiklikleri geri almanızı sağlayan bir kaynak denetim sistemi kullanmanızı öneririz. yapı iskelesini çalıştırdıktan Identity sonra değişiklikleri inceleyin.

İki Faktörlü Kimlik Doğrulaması, Hesap onayı ve parola kurtarma ve ile Identitydiğer güvenlik özellikleri kullanılırken hizmetler gereklidir. yapı iskelesi Identityoluşturulurken hizmetler veya hizmet saptamaları oluşturulmaz. Bu özellikleri etkinleştirmek için hizmetlerin el ile eklenmesi gerekir. Örneğin, bkz . E-posta Onayı Gerektir.

Genellikle, tek tek hesaplarla oluşturulan uygulamalar yeni bir veri bağlamı oluşturmamalıdır.

Mevcut yetkilendirme olmadan bir Razor projeye iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Geçişler, UseAuthentication ve düzen

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Düzen değişiklikleri

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini düzen dosyasına ekleyin:

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

Yetkilendirmeli bir Razor projeye iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Mevcut yetkilendirme olmadan bir MVC projesine iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini dosyaya Views/Shared/_Layout.cshtml ekleyin:

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

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Aşağıdaki vurgulanmış kodda gösterildiği gibi öğesini Program.cs ekleyinMapRazorPages:

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

Yetkilendirmeli bir MVC projesine iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Yetkilendirme ile sunucu tarafı Blazor bir uygulamaya iskele Identity oluşturma

Microsoft.VisualStudio.Web.CodeGeneration.Design NuGet paketini yükleyin.

Dekont

.NET uygulamalarına paket ekleme hakkında yönergeler için, Paket tüketimi iş akışında (NuGet belgeleri)paketleri yüklemek ve yönetmek altındaki makalelere bakın. NuGet.org'da doğru paket sürümlerini onaylayın.


İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Geçişler

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Stil kimlik doğrulama uç noktaları

Sunucu tarafı Blazor uygulamalar Sayfalar Identity sayfalarını kullandığındanRazor, bir ziyaretçi sayfalar ve bileşenler arasında Identity gezindiğinde kullanıcı arabiriminin stili değişir. Uyumsuz stilleri ele almak için iki seçeneğiniz vardır:

Özel Identity bileşenler

ASP.NET Core Identity , uygulamalarda birincil istemci-sunucu iletişim modeli Blazor olmayan HTTP isteği ve yanıt iletişimi bağlamında çalışacak şekilde tasarlanmıştır. Kullanıcı yönetimi için ASP.NET Core Identity kullanan ASP.NET Core uygulamaları, kullanıcı kaydı, oturum açma, oturumu kapatma ve diğer kullanıcı yönetimi görevleri gibi Identity ile ilgili kullanıcı arabirimi Razor bileşenleri yerine Razor Pages kullanmalıdır.

SignInManager<TUser> Bileşenlerde Razor desteklenmediğinden ve UserManager<TUser> desteklenmediğinden, sunucu tarafı Identityetkinleştirilmiş bir ASP.NET Core uygulaması aracılığıyla bileşenlerden Razor eylemleri yönetmek Identity için web API'sini kullanmanızı öneririz. Uygulamalar için web API'leri oluşturma yönergeleri için Blazor bkz . ASP.NET Core Blazor uygulamasından web API'sini çağırma.

Sayfalar yerine Razor bileşenleri Identity kullanma Razor yaklaşımı kendi özelRazorIdentitybileşenlerinizi oluşturmaktır, ancak Microsoft bu yaklaşımı önermez veya desteklemez. Ek bağlam için aşağıdaki tartışmaları inceleyin. Aşağıdaki tartışmalarda, Microsoft dışı GitHub depolarında sorun açıklamalarındaki kod örnekleri ve çapraz bağlantılı kod örnekleri Microsoft tarafından desteklenmez, ancak bazı geliştiriciler için yararlı olabilir:

Özel IdentityRazor bileşenler oluşturmaya çalışırken veya üçüncü taraf Razor bileşenleri ararken ek yardım için aşağıdaki kaynakları öneririz:

Uygulama stilleriyle Blazor özel düzen kullanma

Sayfa Identity düzeni ve stilleri, varsayılan Blazor temaya benzer stiller kullanan sayfalar üretmek için değiştirilebilir. Bu yaklaşım belgelerde ele alınmıyor.

İstemci tarafı Blazor uygulamaları

İstemci tarafı Blazor uygulamaları kendi Identity kullanıcı arabirimi yaklaşımlarını kullanır ve ASP.NET Core Identity iskelesini kullanamaz. Sunucu tarafı ASP.NET Barındırılan Blazor çözümlerin Çekirdek uygulamaları bu makaledeki Razor Sayfalar/MVC yönergelerini izleyebilir ve destekleyen Identitydiğer ASP.NET Core uygulamaları gibi yapılandırılır.

Çerçeve, Blazor kullanıcı arabirimi sayfalarının Identity bileşen sürümlerini içermezRazor. Identity Kullanıcı arabirimi Razor bileşenleri özel olarak oluşturulabilir veya desteklenmeyen üçüncü taraf kaynaklardan alınabilir.

Daha fazla bilgi için Güvenlik ve makalelere Blazor bakın.Identity

Tam Identity kullanıcı arabirimi kaynağı oluşturma

Kullanıcı arabiriminin Identity tam denetimini korumak için iskeleyi Identity çalıştırın ve Tüm dosyaları geçersiz kıl'ı seçin.

Parola yapılandırması

içinde Startup.ConfigureServicesyapılandırıldıysaPasswordOptions,[StringLength]yapı iskelesi sayfalarındaki Identity özellik için Password öznitelik yapılandırması gerekebilir. InputModelPassword özellikleri aşağıdaki dosyalarda bulunur:

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

Sayfayı devre dışı bırakma

Bu bölümde yazmaç sayfasının nasıl devre dışı bırakılacağı gösterilmektedir, ancak herhangi bir sayfayı devre dışı bırakmak için bu yaklaşım kullanılabilir.

Kullanıcı kaydını devre dışı bırakmak için:

  • yapı iskelesi Identity. Account.Register, Account.Login ve Account.RegisterConfirmation bilgilerini ekleyin. Örneğin:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Kullanıcıların bu uç noktadan kaydolmaması için güncelleştirin Areas/Identity/Pages/Account/Register.cshtml.cs :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Önceki değişikliklerle tutarlı olacak şekilde güncelleştirin Areas/Identity/Pages/Account/Register.cshtml :

    @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>
    
  • Kayıt bağlantısını açıklama satırı veya kaldırma Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Alanlar//Sayfalar/IdentityHesap/RegisterConfirmation sayfasını güncelleştirin.

    • Cshtml dosyasından kodu ve bağlantıları kaldırın.
    • onay kodunu içinden PageModelkaldırın:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Kullanıcı eklemek için başka bir uygulama kullanma

Web uygulamasının dışına kullanıcı eklemek için bir mekanizma sağlayın. Kullanıcı ekleme seçenekleri şunlardır:

  • Ayrılmış bir yönetici web uygulaması.
  • Konsol uygulaması.

Aşağıdaki kodda kullanıcı eklemeye yönelik bir yaklaşım özetlenmiştir:

  • Kullanıcıların listesi belleğe okunur.
  • Her kullanıcı için güçlü bir benzersiz parola oluşturulur.
  • Kullanıcı veritabanına eklenir Identity .
  • Kullanıcıya bildirim gönderilir ve parolayı değiştirmesi bildirilir.
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>();
            });
}

Aşağıdaki kod, kullanıcı eklemeyi özetler:


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

Üretim senaryoları için de benzer bir yaklaşım izlenebilir.

Statik Identity varlıkların yayımlanmasını engelleme

Statik Identity varlıkların web kökünde yayımlanmasını önlemek için bkz. ASP.NET Core'da Identitygiriş.

ASP.NET Core, Sınıf Kitaplığı olarak ASP.NET Core Identity sağlar.Razor İçeren Identity uygulamalar, Sınıf Kitaplığı'nda (RCL) bulunan kaynak kodunu seçmeli olarak eklemek için iskeleyi IdentityRazor uygulayabilir. Kodu değiştirmek ve davranışı değiştirmek için kaynak kodu oluşturmak isteyebilirsiniz. Örneğin, yapı iskelesine kayıtta kullanılan kodu oluşturmasını söyleyebilirsiniz. Oluşturulan kod, RCL'deki aynı koddan Identity önceliklidir. Kullanıcı arabiriminin tam denetimini elde etmek ve varsayılan RCL'yi kullanmamak için Tam Identity kullanıcı arabirimi kaynağı oluşturma bölümüne bakın.

Kimlik doğrulaması içermeyen uygulamalar RCL Identity paketini eklemek için iskeleyi uygulayabilir. Oluşturulacak kodu seçme Identity seçeneğiniz vardır.

yapı iskelesi gerekli kodun çoğunu oluştursa da, işlemi tamamlamak için projenizi güncelleştirmeniz gerekir. Bu belgede bir Identity iskele güncelleştirmesini tamamlamak için gereken adımlar açıklanmaktadır.

Dosya farklarını gösteren ve değişiklikleri geri almanızı sağlayan bir kaynak denetim sistemi kullanmanızı öneririz. yapı iskelesini çalıştırdıktan Identity sonra değişiklikleri inceleyin.

İki Faktörlü Kimlik Doğrulaması, Hesap onayı ve parola kurtarma ve ile Identitydiğer güvenlik özellikleri kullanılırken hizmetler gereklidir. yapı iskelesi Identityoluşturulurken hizmetler veya hizmet saptamaları oluşturulmaz. Bu özellikleri etkinleştirmek için hizmetlerin el ile eklenmesi gerekir. Örneğin, bkz . E-posta Onayı Gerektir.

Mevcut tek tek hesapları olan bir projeye yeni bir veri bağlamı ile iskele oluştururken Identity :

  • içinde Startup.ConfigureServices, şu çağrıları kaldırın:
    • AddDbContext
    • AddDefaultIdentity

Örneğin, AddDbContext ve AddDefaultIdentity aşağıdaki kodda açıklama satırı oluşturulur:

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

Yukarıdaki kod, içinde yinelenen kodu açıklama olarak gösterir Areas/Identity/IdentityHostingStartup.cs

Genellikle, tek tek hesaplarla oluşturulan uygulamalar yeni bir veri bağlamı oluşturmamalıdır.

Boş bir projeye iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

sınıfını Startup aşağıdakine benzer bir kodla güncelleştirin:

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 önerilir ancak gerekli değildir. Daha fazla bilgi için bkz . HTTP Katı Aktarım Güvenliği Protokolü.

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Mevcut yetkilendirme olmadan bir Razor projeye iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Identity içinde Areas/Identity/IdentityHostingStartup.csyapılandırılır. Daha fazla bilgi için bkz . IHostingStartup.

Geçişler, UseAuthentication ve düzen

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Kimlik doğrulamayı etkinleştir

sınıfını Startup aşağıdakine benzer bir kodla güncelleştirin:

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 önerilir ancak gerekli değildir. Daha fazla bilgi için bkz . HTTP Katı Aktarım Güvenliği Protokolü.

Düzen değişiklikleri

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini düzen dosyasına ekleyin:

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

Yetkilendirmeli bir Razor projeye iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Bazı Identity seçenekler içinde Areas/Identity/IdentityHostingStartup.csyapılandırılır. Daha fazla bilgi için bkz . IHostingStartup.

Mevcut yetkilendirme olmadan bir MVC projesine iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

İsteğe bağlı: Oturum açma kısmi (_LoginPartial) öğesini dosyaya Views/Shared/_Layout.cshtml ekleyin:

<!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>
  • Dosyayı şuraya taşı:Pages/Shared/_LoginPartial.cshtmlViews/Shared/_LoginPartial.cshtml

Identity içinde Areas/Identity/IdentityHostingStartup.csyapılandırılır. Daha fazla bilgi için bkz. IHostingStartup.

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

sınıfını Startup aşağıdakine benzer bir kodla güncelleştirin:

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 önerilir ancak gerekli değildir. Daha fazla bilgi için bkz . HTTP Katı Aktarım Güvenliği Protokolü.

Yetkilendirmeli bir MVC projesine iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Mevcut yetkilendirme olmadan bir sunucu tarafı Blazor uygulamasına iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Identity içinde Areas/Identity/IdentityHostingStartup.csyapılandırılır. Daha fazla bilgi için bkz. IHostingStartup.

Geçişler

Oluşturulan Identity veritabanı kodu, Entity Framework Core Geçişleri gerektirir. Şemayı oluşturmak Identity için bir geçiş oluşturulmadıysa ve veritabanına uygulanmadıysa, bir geçiş oluşturun ve veritabanını güncelleştirin. Örneğin, aşağıdaki komutları çalıştırın:

Visual Studio Paket Yöneticisi Konsolu'nda:

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

Komutun "Şema OluşturIdentity" ad parametresi Add-Migration rastgeledir. "CreateIdentitySchema" geçişi açıklar.

Identity Şema önceden oluşturulduysa ancak veritabanına uygulanmadıysa, yalnızca veritabanını güncelleştirme komutu yürütülmelidir:

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Update-Database

Update-Database

Aşağıdaki komutla şemanın Identity uygulanmasını onaylayabilirsiniz. Komutun çıktısı, veritabanına hangi geçişlerin uygulandığını gösteren bir "applied" sütunu içerir.

Visual Studio Paket Yöneticisi Konsolu'nda komutunu yürütür:Get-Migration

Get-Migration

Birden fazla veritabanı bağlamı varsa, bağlamı parametresiyle -Context belirtin.

Stil kimlik doğrulama uç noktaları

Sunucu tarafı Blazor uygulamalar Sayfalar Identity sayfalarını kullandığındanRazor, bir ziyaretçi sayfalar ve bileşenler arasında Identity gezindiğinde kullanıcı arabiriminin stili değişir. Uyumsuz stilleri ele almak için iki seçeneğiniz vardır:

Özel Identity bileşenler

Sayfalar yerine bileşenlerini Identity kullanma yaklaşımı, bileşenler oluşturmaktır Identity . Bileşenlerde desteklenmediğinden SignInManager ve UserManager desteklenmediğinden, kullanıcı hesabı eylemlerini işlemek için uygulamadaki Blazor web API Razor uç noktalarını kullanın.

Uygulama stilleriyle Blazor özel düzen kullanma

Sayfa Identity düzeni ve stilleri, varsayılan Blazor temaya benzer stiller kullanan sayfalar üretmek için değiştirilebilir. Bu yaklaşım belgelerde ele alınmıyor.

Yetkilendirme ile sunucu tarafı Blazor bir uygulamaya iskele Identity oluşturma

İskeleyi Identity çalıştırın:

  • Çözüm Gezgini, Projeye >Yeni İskeleli Öğe Ekle'ye>sağ tıklayın.
  • Yeni İskeleli Öğe Ekle iletişim kutusunun sol bölmesinde öğesini seçinIdentity. Orta bölmede öğesini seçin Identity . Ekle düğmesini seçin.
  • Ekle Identity iletişim kutusunda istediğiniz seçenekleri belirleyin.
    • için_Layout.cshtml mevcut, özelleştirilmiş bir düzen sayfanız varsa, yapı iskelesi tarafından yanlış işaretlemeyle düzeninizin üzerine yazılmasını önlemek için Identity mevcut düzen sayfanızı seçin. Örneğin, aşağıdakilerden birini seçin:
      • Pages/Shared/_Layout.cshtmlSayfalar veya Blazor Server mevcut Razor Sayfalar altyapısına sahip projeler içinRazor.
      • Views/Shared/_Layout.cshtml MVC projeleri veya Blazor Server mevcut MVC altyapısına sahip projeler için.
    • Veri bağlamı için (DbContext sınıfı):
      • Veri bağlamı sınıfınızı seçin. Veri bağlamınızı eklemek için en az bir dosya seçmelisiniz.
      • Bir veri bağlamı oluşturmak ve büyük olasılıkla için yeni bir kullanıcı sınıfı oluşturmak için Identitydüğmesini seçin + . Varsayılan değeri kabul edin veya bir sınıf belirtin (örneğin, Contoso.Data.ApplicationDbContext "Contoso" adlı bir şirket için). Yeni bir kullanıcı sınıfı oluşturmak için Kullanıcı sınıfı düğmesini seçin + ve sınıfı belirtin (örneğin, ContosoUser "Contoso" adlı bir şirket için).
    • yapı iskelesini çalıştırmak için Ekle düğmesini seçin.

Bazı Identity seçenekler içinde Areas/Identity/IdentityHostingStartup.csyapılandırılır. Daha fazla bilgi için bkz . IHostingStartup.

İstemci tarafı Blazor uygulamaları

İstemci tarafı Blazor uygulamaları kendi Identity kullanıcı arabirimi yaklaşımlarını kullanır ve ASP.NET Core Identity iskelesini kullanamaz. Sunucu tarafı ASP.NET Barındırılan Blazor çözümlerin Çekirdek uygulamaları bu makaledeki Razor Sayfalar/MVC yönergelerini izleyebilir ve destekleyen Identitydiğer ASP.NET Core uygulamaları gibi yapılandırılır.

Çerçeve, Blazor kullanıcı arabirimi sayfalarının Identity bileşen sürümlerini içermezRazor. Identity Kullanıcı arabirimi Razor bileşenleri özel olarak oluşturulabilir veya desteklenmeyen üçüncü taraf kaynaklardan alınabilir.

Daha fazla bilgi için Güvenlik ve makalelere Blazor bakın.Identity

Tam Identity kullanıcı arabirimi kaynağı oluşturma

Kullanıcı arabiriminin Identity tam denetimini korumak için iskeleyi Identity çalıştırın ve Tüm dosyaları geçersiz kıl'ı seçin.

Aşağıdaki vurgulanmış kod, ASP.NET Core 2.1 web uygulamasında varsayılan Identity kullanıcı arabirimini ile Identity değiştirme değişikliklerini gösterir. Kullanıcı arabiriminin Identity tam denetimine sahip olmak için bunu yapmak isteyebilirsiniz.

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

Varsayılan Identity değer aşağıdaki kodda değiştirilir:

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

Aşağıdaki kod , LogoutPathve AccessDeniedPathkümelerini LoginPathayarlar:

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

Bir IEmailSender uygulamayı kaydedin, örneğin:

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

Parola yapılandırması

içinde Startup.ConfigureServicesyapılandırıldıysaPasswordOptions,[StringLength]yapı iskelesi sayfalarındaki Identity özellik için Password öznitelik yapılandırması gerekebilir. InputModelPassword özellikleri aşağıdaki dosyalarda bulunur:

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

Sayfayı devre dışı bırakma

Bu bölümde yazmaç sayfasının nasıl devre dışı bırakılacağı gösterilmektedir, ancak herhangi bir sayfayı devre dışı bırakmak için bu yaklaşım kullanılabilir.

Kullanıcı kaydını devre dışı bırakmak için:

  • yapı iskelesi Identity. Account.Register, Account.Login ve Account.RegisterConfirmation bilgilerini ekleyin. Örneğin:

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
  • Kullanıcıların bu uç noktadan kaydolmaması için güncelleştirin Areas/Identity/Pages/Account/Register.cshtml.cs :

    public class RegisterModel : PageModel
    {
        public IActionResult OnGet()
        {
            return RedirectToPage("Login");
        }
    
        public IActionResult OnPost()
        {
            return RedirectToPage("Login");
        }
    }
    
  • Önceki değişikliklerle tutarlı olacak şekilde güncelleştirin Areas/Identity/Pages/Account/Register.cshtml :

    @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>
    
  • Kayıt bağlantısını açıklama satırı veya kaldırma Areas/Identity/Pages/Account/Login.cshtml

    @*
    <p>
        <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
    </p>
    *@
    
  • Alanlar//Sayfalar/IdentityHesap/RegisterConfirmation sayfasını güncelleştirin.

    • Cshtml dosyasından kodu ve bağlantıları kaldırın.
    • onay kodunu içinden PageModelkaldırın:
    [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
          public IActionResult OnGet()
          {  
              return Page();
          }
      }
    

Kullanıcı eklemek için başka bir uygulama kullanma

Web uygulamasının dışına kullanıcı eklemek için bir mekanizma sağlayın. Kullanıcı ekleme seçenekleri şunlardır:

  • Ayrılmış bir yönetici web uygulaması.
  • Konsol uygulaması.

Aşağıdaki kodda kullanıcı eklemeye yönelik bir yaklaşım özetlenmiştir:

  • Kullanıcıların listesi belleğe okunur.
  • Her kullanıcı için güçlü bir benzersiz parola oluşturulur.
  • Kullanıcı veritabanına eklenir Identity .
  • Kullanıcıya bildirim gönderilir ve parolayı değiştirmesi bildirilir.
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>();
            });
}

Aşağıdaki kod, kullanıcı eklemeyi özetler:


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

Üretim senaryoları için de benzer bir yaklaşım izlenebilir.

Statik Identity varlıkların yayımlanmasını engelleme

Statik Identity varlıkların web kökünde yayımlanmasını önlemek için bkz. ASP.NET Core'da Identitygiriş.

Ek kaynaklar