Alıştırma - Identity desteğini yapılandırma

Tamamlandı

Identity, özelleştirme olmadan kullanıma hazır olarak sunulur. Standart Identity kullanıcı arabirimi bileşenleri bir .NET Standard Razor Sınıf Kitaplığı’nda (RCL) paketlenir. RCL kullanıldığı için projeye birkaç dosya eklenir.

İlk EF Core geçişi uygulandıktan sonra, destekleyen veritabanı tabloları oluşturulur. Aşağıdaki diyagramda, destekleyen tabloların şemaları gösterilir:

veritabanı diyagramı.

Not

Yukarıdaki görüntüde veritabanındaki anahtar ve ilişkiler yer alır. Anahtar bir anahtardır ve sonsuz (yan yana 8) çok fazladır. Bir veritabanı 1-1, 1-çok ve çoka çok ilişki türüne sahip olabilir. Anahtarlar benzersizdir. Diyagramda bu birleşimlerin ve ilişkilerin nasıl oluşturulacakları gösterildi.

Bu ünitede, mevcut ASP.NET Core Razor Pages projesine Identity eklenecektir.

Projeye Identity ekleme

  1. ASP.NET Core kod iskelesini yükleyin:

    dotnet tool install dotnet-aspnet-codegenerator --version 3.1.2
    

    Aşağıdaki çıkış görüntülenir:

    You can invoke the tool from this directory using the following commands: 'dotnet tool run dotnet-aspnet-codegenerator' or 'dotnet dotnet-aspnet-codegenerator'.
    Tool 'dotnet-aspnet-codegenerator' (version '3.1.2') was successfully installed. Entry is added to the manifest file /home/<USER>/aspnet-learn/src/ContosoPets.Ui/.config/dotnet-tools.json.
    

    İskele, şunları gerçekleştiren bir .NET Core aracıdır:

    • Varsayılan Identity bileşenlerini projeye eklemek için kullanılır.
    • Sonraki ünitede yer alan Identity kullanıcı arabirimi bileşenlerinin özelleştirilmesine olanak tanır.
    • Bu modülde dotnet aspnet-codegenerator aracılığıyla çağrılır.
  2. Aşağıdaki NuGet paketlerini projeye ekleyin:

    dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design --version 3.1.2 && \
        dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore --version 3.1.3 && \
        dotnet add package Microsoft.AspNetCore.Identity.UI --version 3.1.3 && \
        dotnet add package Microsoft.EntityFrameworkCore.Design --version 3.1.3 && \
        dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 3.1.3
    

    Bu paketler, iskele tarafından kullanılan kod oluşturma şablonlarını ve bağımlılıkları yükler.

    İpucu

    Kullanılabilir oluşturucuları görüntülemek için:

    • Komut kabuğunda dotnet aspnet-codegenerator -h komutunu çalıştırın.
    • Visual Studio’da, Çözüm Gezgini’nde projeye sağ tıklayıp Ekle > Yeni İskele Öğesi seçeneğini belirleyin.
  3. Varsayılan Identity bileşenlerini projeye eklemek için iskeleyi kullanın. Proje kökünden aşağıdaki komutu çalıştırın:

    dotnet aspnet-codegenerator identity \
        --useDefaultUI \
        --dbContext ContosoPetsAuth
    

    Yukarıdaki komutta:

    • olarak tanımlanan identity oluşturucu, Identity çerçevesini projeye eklemek için kullanılır.
    • --useDefaultUI seçeneği, varsayılan kullanıcı arabirimi öğelerini içeren bir RCL’nin kullanılacağını gösterir. Bileşenler için stil oluşturmak amacıyla Bootstrap kullanılır.
    • Oluşturulacak EF Core veritabanı bağlam sınıfının adını göstermeye yönelik --dbContext seçeneği.
  4. Düzenleyicinin yenile simgesine tıklayarak dosya gezginini güncelleştirin.

    Cloud Shell simgesine tıklayın.

    Proje kökünde bir Areas dizin yapısı görüntülenir:

    • Areas
      • Identity
        • Data
          • ContosoPetsAuth.cs
        • Pages
          • _ValidationScriptsPartial.cshtml
          • _ViewStart.cshtml
        • IdentityHostingStartup.cs

    Alanlar, bir ASP.NET Core web uygulamasını daha küçük işlevsel gruplar halinde bölümlemeye yönelik bir yol sunar.

PostgreSQL veritabanı sağlayıcısını ekleme

EF Core için PostgreSQL veritabanı sağlayıcını yüklemek amacıyla proje kökünden aşağıdaki komutu çalıştırın:

dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL --version 3.1.3

Bu NuGet paketi, PostgreSQL veritabanıyla etkileşime geçmeye yönelik bilgileri EF Core’a sağlar.

Veritabanı bağlantısını yapılandırma

  1. Areas/Identity/IdentityHostingStartup.cs dosyasının Configure metodunu aşağıdaki kodla değiştirin:

    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            var connBuilder = new NpgsqlConnectionStringBuilder(
                context.Configuration.GetConnectionString("ContosoPetsAuthConnection"))
            {
                Username = context.Configuration["DbUsername"],
                Password = context.Configuration["DbPassword"]
            };
    
            services.AddDbContext<ContosoPetsAuth>(options =>
                options.UseNpgsql(connBuilder.ConnectionString));
    
            services.AddDefaultIdentity<IdentityUser>()
                .AddDefaultUI()
                .AddEntityFrameworkStores<ContosoPetsAuth>();
        });
    }
    
    public void Configure(IWebHostBuilder builder)
    {
        builder.ConfigureServices((context, services) => {
            var connBuilder = new SqlConnectionStringBuilder(
                context.Configuration.GetConnectionString("ContosoPetsAuthConnection"))
            {
                UserID = context.Configuration["DbUsername"],
                Password = context.Configuration["DbPassword"]
            };
    
            services.AddDbContext<ContosoPetsAuth>(options =>
                options.UseSqlServer(connBuilder.ConnectionString));
    
            services.AddDefaultIdentity<IdentityUser>()
                .AddDefaultUI()
                .AddEntityFrameworkStores<ContosoPetsAuth>();
        });
    }
    

    Yukarıdaki kodda:

    • Veritabanı kullanıcı adını ve parolasını almak için Azure Key Vault yapılandırma sağlayıcısı örtük olarak kullanılır:

      Username = context.Configuration["DbUsername"],
      Password = context.Configuration["DbPassword"]
      
      UserID = context.Configuration["DbUsername"],
      Password = context.Configuration["DbPassword"]
      
    • Veritabanı kullanıcı adı ve parolası, appsettings.json dosyasında depolanan bağlantı dizesine eklenir.

    • ContosoPetsAuth adlı EF Core veritabanı bağlam sınıfı, uygun bağlantı dizesiyle yapılandırılır.

    • Varsayılan kullanıcı arabirimi, belirteç sağlayıcıları ve tanımlama bilgisi tabanlı kimlik doğrulamasını da içeren Identity hizmetleri kaydedilir.

  2. Ayrıca, IdentityHostingStartup.cs dosyasının en üstünde bulunan using deyimleri bloğuna aşağıdaki kodu ekleyin. Yaptığınız değişiklikleri kaydedin.

    using Npgsql;
    

    Yukarıdaki kod, Configure metodundaki NpgsqlConnectionStringBuilder sınıfına yapılan başvuruyu çözümler.

    using Microsoft.Data.SqlClient;
    

    Yukarıdaki kod, Configure metodundaki SqlConnectionStringBuilder sınıfına yapılan başvuruyu çözümler.

  3. Startup.cs dosyasının Configure metodunda // Add the app.UseAuthentication code açıklamasını aşağıdaki kodla değiştirin. Yaptığınız değişiklikleri kaydedin.

    app.UseAuthentication();
    

    Yukarıdaki kod, kimlik doğrulaması özelliklerini etkinleştirir. Daha ayrıntılı olarak, uygulamanın HTTP isteklerini işleyen işlem hattına ASP.NET Core kimlik doğrulaması ara yazılımının bir örneği eklenir.

  4. Veritabanı bağlantı dizesini konsola yazdırmak için aşağıdaki komutu çalıştırın. Bağlantı dizesini panonuza kopyalayın.

    echo $dbConnectionString
    
  5. appsettings.json dosyasında, ContosoPetsAuthConnection öğesine yönelik bağlantı dizesini önceki adımdaki bağlantı dizesiyle değiştirin. Yaptığınız değişiklikleri kaydedin.

    ConnectionStrings bölümü, aşağıdaki JSON’a benzer görünmelidir:

    "ConnectionStrings": {
        "ContosoPetsAuthConnection": "Server={HOST NAME}.postgres.database.azure.com;Database=contosopets;Port=5432;Ssl Mode=Require;"
    }
    
    "ConnectionStrings": {
        "ContosoPetsAuthConnection": "Data Source={HOST NAME}.database.windows.net;Initial Catalog=ContosoPets;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False"
    }
    
  6. Uygulamayı derlemek için aşağıdaki komutu çalıştırın:

    dotnet build
    

    Derleme hiç uyarı alınmadan başarılı olur. Derleme başarısız olursa, sorun giderme bilgileri için çıkışı inceleyin.

Veritabanını güncelleştirme

  1. Entity Framework Core geçiş aracını yükleme:

    dotnet tool install dotnet-ef --version 3.1.3
    

    Aşağıdaki çıkış görüntülenir:

    You can invoke the tool from this directory using the following commands: 'dotnet tool run dotnet-ef' or 'dotnet dotnet-ef'.
    Tool 'dotnet-ef' (version '3.1.3') was successfully installed. Entry is added to the manifest file /home/<USER>/aspnet-learn/src/ContosoPets.Ui/.config/dotnet-tools.json.
    

    Geçiş aracı bir .NET Core aracı olup:

    • Kimlik varlığı modelini destekleyen veritabanını oluşturmak ve güncelleştirmek için geçiş adlı kod oluşturur.
    • Mevcut bir veritabanına karşı geçişleri yürütür.
    • Bu modülde dotnet ef aracılığıyla çağrılır.
  2. Veritabanını güncelleştirmek için bir EF Core geçişi oluşturun ve çalıştırın:

    dotnet ef migrations add CreateIdentitySchema && \
        dotnet ef database update
    

    CreateIdentitySchema EF Core geçişi, Identity’yi destekleyen tabloları oluşturmak için bir Veri Tanımlama Dili (DDL) değişiklik betiği uyguladı. Örneğin, aşağıdaki alıntı, geçiş tarafından oluşturulan bir CREATE TABLE deyimini gösterir:

    info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (329ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE "AspNetUsers" (
          "Id" text NOT NULL,
          "UserName" character varying(256) NULL,
          "NormalizedUserName" character varying(256) NULL,
          "Email" character varying(256) NULL,
          "NormalizedEmail" character varying(256) NULL,
          "EmailConfirmed" boolean NOT NULL,
          "PasswordHash" text NULL,
          "SecurityStamp" text NULL,
          "ConcurrencyStamp" text NULL,
          "PhoneNumber" text NULL,
          "PhoneNumberConfirmed" boolean NOT NULL,
          "TwoFactorEnabled" boolean NOT NULL,
          "LockoutEnd" timestamp with time zone NULL,
          "LockoutEnabled" boolean NOT NULL,
          "AccessFailedCount" integer NOT NULL,
          CONSTRAINT "PK_AspNetUsers" PRIMARY KEY ("Id")
      );
    
    info: Microsoft.EntityFrameworkCore.Database.Command[20101]
          Executed DbCommand (98ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
          CREATE TABLE [AspNetUsers] (
              [Id] nvarchar(450) NOT NULL,
              [UserName] nvarchar(256) NULL,
              [NormalizedUserName] nvarchar(256) NULL,
              [Email] nvarchar(256) NULL,
              [NormalizedEmail] nvarchar(256) NULL,
              [EmailConfirmed] bit NOT NULL,
              [PasswordHash] nvarchar(max) NULL,
              [SecurityStamp] nvarchar(max) NULL,
              [ConcurrencyStamp] nvarchar(max) NULL,
              [PhoneNumber] nvarchar(max) NULL,
              [PhoneNumberConfirmed] bit NOT NULL,
              [TwoFactorEnabled] bit NOT NULL,
              [LockoutEnd] datetimeoffset NULL,
              [LockoutEnabled] bit NOT NULL,
              [AccessFailedCount] int NOT NULL,
              CONSTRAINT [PK_AspNetUsers] PRIMARY KEY ([Id])
          );
    
  3. Veritabanındaki tabloları listelemek için aşağıdaki komutu çalıştırın:

    db -c "SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname != 'pg_catalog' AND schemaname != 'information_schema' ORDER BY tablename"
    

    Çıkış, tabloların oluşturulduğunu onaylar:

           tablename
    -----------------------
     AspNetRoleClaims
     AspNetRoles
     AspNetUserClaims
     AspNetUserLogins
     AspNetUserRoles
     AspNetUserTokens
     AspNetUsers
     __EFMigrationsHistory
    (8 rows)
    
    db -Q "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dbo' ORDER BY TABLE_NAME" -Y 25
    

    Tabloların oluşturulduğunu onaylayan aşağıdaki çıkış görüntülenir.

    TABLE_NAME
    -------------------------
    __EFMigrationsHistory
    AspNetRoleClaims
    AspNetRoles
    AspNetUserClaims
    AspNetUserLogins
    AspNetUserRoles
    AspNetUsers
    AspNetUserTokens
    
    (8 rows affected)
    
  1. Pages/Shared/_Layout.cshtml dosyasında, @* Add the _LoginPartial partial view *@ açıklamasını aşağıdakiyle değiştirin. Yaptığınız değişiklikleri kaydedin.

    <partial name="_LoginPartial" />
    

    Yukarıdaki işaretleme, varsayılan düzeni kullanan herhangi bir sayfanın üst bilgisinde yer alan _LoginPartial kısmi görünümünü işler. _LoginPartial, Identity iskelesi tarafından eklendi. Kullanıcı oturum açmadıysa, bu kısmi görünüm Oturum açın ve Kaydolun bağlantılarını kullanıcıya gösterir.

  2. Uygulamayı derlemek için aşağıdaki komutu çalıştırın:

    dotnet build --no-restore
    

    Son derlemeden sonra NuGet paketi eklenmediğinden --no-restore seçeneği de eklenmiştir. Derleme işlemi, NuGet paketlerinin geri yüklenmesini atlar ve uyarı oluşturmadan başarıyla tamamlanır. Derleme başarısız olursa, sorun giderme bilgileri için çıkışı inceleyin.

  3. Aşağıdaki komutu çalıştırarak uygulamayı Azure App Service’e dağıtın:

    az webapp up
    

    Not

    Proje kökündeki .azure/config dosyası, az webapp up tarafından kullanılan yapılandırma değerlerini içerir.

  4. Uygulamanın URL’sini görmek için aşağıdaki komutu çalıştırın. Tarayıcınızda bu URL’ye gidin.

    echo $webAppUrl
    
  5. Uygulamanın üst bilgisinde bulunan Kaydolun bağlantısına tıklayın. Yeni bir hesap oluşturmak için formu doldurun.

    Başarıyla kaydolduktan sonra:

    • Giriş sayfasına yönlendirilirsiniz.
    • Uygulamanın üstbilgisinde Merhaba [E-posta adresi]! iletisi ve Oturumu kapat bağlantısı görüntülenir.
    • .AspNetCore.Identity.Application adlı bir tanımlama bilgisi oluşturulur. Identity, kullanıcı oturumlarını tanımlama bilgisi tabanlı kimlik doğrulaması ile korur.
  6. Uygulamanın üst bilgisinde bulunan Oturumu kapat bağlantısına tıklayın.

    Oturum başarıyla kapatıldıktan sonra, kullanıcı oturumunu sonlandırmak için .AspNetCore.Identity.Application tanımlama bilgisi silinir.