Mevcut Bir Web Sitesini SQL Üyeliğinden ASP.NET Identity’ye Geçirme

Tarafından Rick Anderson, Suhas Joshi

Bu öğreticide, SQL Üyeliği kullanılarak oluşturulan kullanıcı ve rol verileriyle mevcut bir web uygulamasını yeni ASP.NET Identity sistemine geçirme adımları gösterilmektedir. Bu yaklaşım, mevcut veritabanı şemasını ASP.NET Kimliği için gerekli olan şemayla değiştirmeyi ve eski/yeni sınıflara bağlanmayı içerir. Bu yaklaşımı benimsedikten sonra veritabanınız geçirildikten sonra Identity'de yapılacak güncelleştirmeler zahmetsizce gerçekleştirilir.

Bu öğreticide, kullanıcı ve rol verileri oluşturmak için Visual Studio 2010 kullanılarak oluşturulan bir web uygulaması şablonu (Web Forms) alacağız. Ardından SQL betiklerini kullanarak mevcut veritabanını Kimlik sisteminin ihtiyaç duyduğu tablolara geçireceğiz. Şimdi gerekli NuGet paketlerini yükleyecek ve üyelik yönetimi için Kimlik sistemini kullanan yeni hesap yönetimi sayfaları ekleyeceğiz. Geçiş testi olarak, SQL üyeliği kullanılarak oluşturulan kullanıcılar oturum açabilmelidir ve yeni kullanıcılar da kaydolabilmelidir. Örneğin tamamını burada bulabilirsiniz. Ayrıca bkz . ASP.NET Üyeliğinden ASP.NET Kimliğe Geçiş.

Başlarken

SQL Üyeliği ile uygulama oluşturma

  1. SQL üyeliği kullanan ve kullanıcı ve rol verilerine sahip mevcut bir uygulamayla başlamalıyız. Bu makalenin amacı doğrultusunda Visual Studio 2010'da bir web uygulaması oluşturalım.

    Visual Studio 2010'da web uygulaması oluşturma işleminin ekran görüntüsü.

  2. ASP.NET Yapılandırma aracını kullanarak 2 kullanıcı oluşturun: oldAdminUser ve oldUser.

    A S P öğesinin ekran görüntüsü. İki kullanıcı oluşturmak için N E T Yapılandırma aracı.

    Tüm güvenliği yönetmek için web sitesi yönetim aracının ekran görüntüsü.

  3. Yönetici adlı bir rol oluşturun ve bu role kullanıcı olarak 'oldAdminUser' ekleyin.

    Bu rolde kullanıcı olarak oluşturulan Yönetici rolünün ekran görüntüsü.

  4. Default.aspx ile sitenin Yönetici bir bölümünü oluşturun. yalnızca Yönetici rollerindeki kullanıcılara erişimi etkinleştirmek için web.config dosyasında yetkilendirme etiketini ayarlayın. Daha fazla bilgiyi burada bulabilirsiniz https://www.asp.net/web-forms/tutorials/security/roles/role-based-authorization-cs

    Sitenin Yönetici bölümünün ekran görüntüsü.

  5. SQL üyelik sistemi tarafından oluşturulan tabloları anlamak için Veritabanını Sunucu Gezgini'nde görüntüleyin. Kullanıcı oturum açma verileri aspnet_Users ve aspnet_Membership tablolarında, rol verileri ise aspnet_Roles tablosunda depolanır. rollerin aspnet_UsersInRoles tablosunda depolandığı kullanıcılar hakkında bilgi. Temel üyelik yönetimi için, yukarıdaki tablolardaki bilgilerin ASP.NET Kimlik sistemine taşıması yeterlidir.

    S Q L üyelik sistemi tarafından oluşturulan tabloları anlamak üzere veritabanını görüntülemek için Sunucu Gezgini'nin ekran görüntüsü.

Visual Studio 2013 geçiş

  1. En son güncelleştirmelerle birlikte Web veya Visual Studio 2013 için Visual Studio Express 2013'ü yükleyin.

  2. Visual Studio'nun yüklü sürümünde yukarıdaki projeyi açın. makinede SQL Server Express yüklü değilse, bağlantı dizesi SQL Express kullandığından projeyi açtığınızda bir istem görüntülenir. SQL Express'i yüklemeyi seçebilir veya geçici çözüm olarak bağlantı dizesini LocalDb olarak değiştirebilirsiniz. Bu makale için Bunu LocalDb olarak değiştireceğiz.

  3. web.config açın ve bağlantı dizesini olarak değiştirin. SQLExpress to (LocalDb)v11.0. Bağlantı dizesinden 'User Instance=true' öğesini kaldırın.

    bağlantı dizesini Visual Studio 2013 geçirecek şekilde değiştirme işleminin ekran görüntüsü.

  4. Sunucu Gezgini'ni açın ve tablo şemasının ve verilerin gözlemlenebilir olduğunu doğrulayın.

  5. ASP.NET Identity sistemi, çerçevenin 4.5 veya üzeri sürümüyle çalışır. Uygulamayı 4,5 veya üzeri bir sürüme yeniden hedefleyin.

    A S P öğesinin ekran görüntüsü. N E T Kimlik sistemi.

    Hata olmadığını doğrulamak için projeyi derleyin.

Nuget paketlerini yükleme

  1. Çözüm Gezgini'da NuGet Paketlerini Yönet projesine > sağ tıklayın. Arama kutusuna "Asp.net Kimliği" yazın. Sonuç listesinden paketi seçin ve yükle'ye tıklayın. "Kabul Ediyorum" düğmesine tıklayarak lisans sözleşmesini kabul edin. Bu paketin bağımlılık paketlerini yükleyeceğini unutmayın: EntityFramework ve Microsoft ASP.NET Identity Core. Benzer şekilde aşağıdaki paketleri yükleyin (OAuth oturum açma özelliğini etkinleştirmek istemiyorsanız son 4 OWIN paketini atlayın):

    • Microsoft.AspNet.Identity.Owin

    • Microsoft.Owin.Host.SystemWeb

    • Microsoft.Owin.Security.Facebook

    • Microsoft.Owin.Security.Google

    • Microsoft.Owin.Security.MicrosoftAccount

    • Microsoft.Owin.Security.Twitter

      Çözüm Gezgini'da Nuget paketlerini yükleme işleminin ekran görüntüsü.

Veritabanını yeni Kimlik sistemine geçirme

Sonraki adım, var olan veritabanını ASP.NET Identity sisteminin gerektirdiği bir şemaya geçirmektir. Bunu başarmak için, yeni tablolar oluşturmak ve mevcut kullanıcı bilgilerini yeni tablolara geçirmek için bir dizi komut içeren bir SQL betiği çalıştırıyoruz. Betik dosyası burada bulunabilir.

Bu betik dosyası bu örne özeldir. SQL üyeliği kullanılarak oluşturulan tabloların şeması özelleştirilir veya değiştirilirse betiklerin buna göre değiştirilmesi gerekir.

Şema geçişi için SQL betiği oluşturma

ASP.NET Kimlik sınıflarının mevcut kullanıcıların verileriyle hazır olması için veritabanı şemasını ASP.NET Identity için gereken şemaya geçirmemiz gerekir. Bunu yapmak için yeni tablolar ekleyebilir ve mevcut bilgileri bu tablolara kopyalayabiliriz. Varsayılan olarak ASP.NET Identity, bilgileri depolamak/almak için Identity modeli sınıflarını veritabanına geri eşlemek için EntityFramework kullanır. Bu model sınıfları, kullanıcı ve rol nesnelerini tanımlayan temel Kimlik arabirimlerini uygular. Veritabanındaki tablolar ve sütunlar bu model sınıflarını temel alır. Identity v2.1.0'daki EntityFramework model sınıfları ve özellikleri aşağıda tanımlandığı gibi

IdentityUser Tür IdentityRole IdentityUserRole IdentityUserLogin IdentityUserClaim
Id string Id Roleıd ProviderKey Id
Kullanıcı adı string Name UserId UserId Claimtype
PasswordHash string LoginProvider ClaimValue
SecurityStamp string User_Id
E-posta string
EmailConfirmed bool
PhoneNumber string
PhoneNumberConfirmed bool
LockoutEnabled bool
LockoutEndDate DateTime
AccessFailedCount int

Bu modellerin her biri için özelliklere karşılık gelen sütunlar içeren tablolara sahip olmamız gerekir. Sınıflar ve tablolar arasındaki eşleme yönteminde OnModelCreatingIdentityDBContexttanımlanır. Bu, yapılandırmanın akıcı API yöntemi olarak bilinir ve burada daha fazla bilgi bulunabilir. Sınıfların yapılandırması aşağıda belirtildiği gibidir

Sınıf Tablo Birincil anahtar Yabancı anahtar
IdentityUser AspnetUsers Id
IdentityRole AspnetRoles Id
IdentityUserRole AspnetUserRole UserId + RoleId User_Id-AspnetUsers> RoleId-AspnetRoles>
IdentityUserLogin AspnetUserLogins ProviderKey+UserId + LoginProvider UserId-AspnetUsers>
IdentityUserClaim AspnetUserClaims Id User_Id-AspnetUsers>

Bu bilgilerle yeni tablolar oluşturmak için SQL deyimleri oluşturabiliriz. Her deyimi tek tek yazabilir veya EntityFramework PowerShell komutlarını kullanarak betiğin tamamını oluşturabiliriz ve bu komutları gerektiği gibi düzenleyebiliriz. Bunu yapmak için VS'de Görünüm veya Araçlar menüsünden Paket Yöneticisi Konsolu'nu açın

  • EntityFramework geçişlerini etkinleştirmek için "Enable-Migrations" komutunu çalıştırın.
  • Veritabanını C#/VB'de oluşturmak için ilk kurulum kodunu oluşturan "Add-migration initial" komutunu çalıştırın.
  • Son adım, model sınıflarını temel alan SQL betiğini oluşturan "Update-Database –Script" komutunu çalıştırmaktır.

Uygulama Kimlik veri deposu olarak SQLite kullanıyorsa bazı komutlar desteklenmez. Veritabanı altyapısındaki sınırlamalar nedeniyle komutlar Alter aşağıdaki özel durumu oluşturur:

"System.NotSupportedException: SQLite bu geçiş işlemini desteklemiyor."

Geçici bir çözüm olarak, tabloları değiştirmek için veritabanında Code First geçişlerini çalıştırın.

Bu veritabanı oluşturma betiği, yeni sütunlar eklemek ve verileri kopyalamak için ek değişiklikler yaptığımız bir başlangıç olarak kullanılabilir. Bunun avantajı, Identity sürümlerinin _MigrationHistory gelecek sürümleri için model sınıfları değiştiğinde veritabanı şemasını değiştirmek için EntityFramework tarafından kullanılan tabloyu oluşturmamızdır.

SQL üyeliği kullanıcı bilgilerinin, Kimlik kullanıcı modeli sınıfındakilere ek olarak e-posta, parola denemeleri, son oturum açma tarihi, son kilitleme tarihi vb. özellikleri de vardı. Bu yararlı bilgilerdir ve Kimlik sistemine taşınmasını istiyoruz. Bu, kullanıcı modeline ek özellikler ekleyerek ve bunları veritabanındaki tablo sütunlarına geri eşleyerek yapılabilir. Modeli alt sınıfa IdentityUser alan bir sınıf ekleyerek bunu yapabiliriz. Bu özel sınıfa özellikleri ekleyebilir ve tabloyu oluştururken ilgili sütunları eklemek için SQL betiğini düzenleyebiliriz. Bu sınıfın kodu makalede daha ayrıntılı olarak açıklanmıştır. Yeni özellikleri ekledikten sonra tabloyu oluşturmaya AspnetUsers yönelik SQL betiği şu şekilde olacaktır:

CREATE TABLE [dbo].[AspNetUsers] (
    [Id]            NVARCHAR (128) NOT NULL,
    [UserName]      NVARCHAR (MAX) NULL,
    [PasswordHash]  NVARCHAR (MAX) NULL,
    [SecurityStamp] NVARCHAR (MAX) NULL,
    [EmailConfirmed]       BIT            NOT NULL,
    [PhoneNumber]          NVARCHAR (MAX) NULL,
    [PhoneNumberConfirmed] BIT            NOT NULL,
    [TwoFactorEnabled]     BIT            NOT NULL,
    [LockoutEndDateUtc]    DATETIME       NULL,
    [LockoutEnabled]       BIT            NOT NULL,
    [AccessFailedCount]    INT            NOT NULL,
    [ApplicationId]                          UNIQUEIDENTIFIER NOT NULL,
    [LegacyPasswordHash]  NVARCHAR (MAX) NULL,
    [LoweredUserName]  NVARCHAR (256)   NOT NULL,
    [MobileAlias]      NVARCHAR (16)    DEFAULT (NULL) NULL,
    [IsAnonymous]      BIT              DEFAULT ((0)) NOT NULL,
    [LastActivityDate] DATETIME2         NOT NULL,
    [MobilePIN]                              NVARCHAR (16)    NULL,
    [Email]                                  NVARCHAR (256)   NULL,
    [LoweredEmail]                           NVARCHAR (256)   NULL,
    [PasswordQuestion]                       NVARCHAR (256)   NULL,
    [PasswordAnswer]                         NVARCHAR (128)   NULL,
    [IsApproved]                             BIT              NOT NULL,
    [IsLockedOut]                            BIT              NOT NULL,
    [CreateDate]                             DATETIME2               NOT NULL,
    [LastLoginDate]                          DATETIME2         NOT NULL,
    [LastPasswordChangedDate]                DATETIME2         NOT NULL,
    [LastLockoutDate]                        DATETIME2         NOT NULL,
    [FailedPasswordAttemptCount]             INT              NOT NULL,
    [FailedPasswordAttemptWindowStart]       DATETIME2         NOT NULL,
    [FailedPasswordAnswerAttemptCount]       INT              NOT NULL,
    [FailedPasswordAnswerAttemptWindowStart] DATETIME2         NOT NULL,
    [Comment]                                NTEXT            NULL,
    CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ([Id] ASC),
    FOREIGN KEY ([ApplicationId]) REFERENCES [dbo].[aspnet_Applications] ([ApplicationId]),
);

Ardından, SQL üyeliği veritabanındaki mevcut bilgileri Identity için yeni eklenen tablolara kopyalamamız gerekir. Bu, verileri doğrudan bir tablodan diğerine kopyalayarak SQL aracılığıyla yapılabilir. Tablo satırlarına veri eklemek için yapısını kullanırız INSERT INTO [Table] . Başka bir tablodan kopyalamak için deyimini INSERT INTO deyimiyle SELECT birlikte kullanabiliriz. Tüm kullanıcı bilgilerini almak için aspnet_Users ve aspnet_Membership tablolarını sorgulamamız ve verileri AspNetUsers tablosuna kopyalamamız gerekir. ve SELECT ile JOIN birlikte ve LEFT OUTER JOIN deyimlerini kullanırızINSERT INTO. Tablolar arasında verileri sorgulama ve kopyalama hakkında daha fazla bilgi için bu bağlantıya bakın. Buna ek olarak, SQL üyeliğinde varsayılan olarak buna eşleyen hiçbir bilgi olmadığından, AspnetUserLogins ve AspnetUserClaims tabloları ile başlamak için boş olur. Kopyalanan tek bilgi kullanıcılara ve rollere yöneliktir. Önceki adımlarda oluşturulan proje için, kullanıcılar tablosuna bilgi kopyalamaya yönelik SQL sorgusu şöyle olacaktır:

INSERT INTO AspNetUsers(Id,UserName,PasswordHash,SecurityStamp,EmailConfirmed,
PhoneNumber,PhoneNumberConfirmed,TwoFactorEnabled,LockoutEndDateUtc,LockoutEnabled,AccessFailedCount,
ApplicationId,LoweredUserName,MobileAlias,IsAnonymous,LastActivityDate,LegacyPasswordHash,
MobilePIN,Email,LoweredEmail,PasswordQuestion,PasswordAnswer,IsApproved,IsLockedOut,CreateDate,
LastLoginDate,LastPasswordChangedDate,LastLockoutDate,FailedPasswordAttemptCount,
FailedPasswordAnswerAttemptWindowStart,FailedPasswordAnswerAttemptCount,FailedPasswordAttemptWindowStart,Comment)
SELECT aspnet_Users.UserId,aspnet_Users.UserName,(aspnet_Membership.Password+'|'+CAST(aspnet_Membership.PasswordFormat as varchar)+'|'+aspnet_Membership.PasswordSalt),NewID(),
'true',NULL,'false','true',aspnet_Membership.LastLockoutDate,'true','0',
aspnet_Users.ApplicationId,aspnet_Users.LoweredUserName,
aspnet_Users.MobileAlias,aspnet_Users.IsAnonymous,aspnet_Users.LastActivityDate,aspnet_Membership.Password,
aspnet_Membership.MobilePIN,aspnet_Membership.Email,aspnet_Membership.LoweredEmail,aspnet_Membership.PasswordQuestion,aspnet_Membership.PasswordAnswer,
aspnet_Membership.IsApproved,aspnet_Membership.IsLockedOut,aspnet_Membership.CreateDate,aspnet_Membership.LastLoginDate,aspnet_Membership.LastPasswordChangedDate,
aspnet_Membership.LastLockoutDate,aspnet_Membership.FailedPasswordAttemptCount, aspnet_Membership.FailedPasswordAnswerAttemptWindowStart,
aspnet_Membership.FailedPasswordAnswerAttemptCount,aspnet_Membership.FailedPasswordAttemptWindowStart,aspnet_Membership.Comment
FROM aspnet_Users
LEFT OUTER JOIN aspnet_Membership ON aspnet_Membership.ApplicationId = aspnet_Users.ApplicationId 
AND aspnet_Users.UserId = aspnet_Membership.UserId;

Yukarıdaki SQL deyiminde, aspnet_Users ve aspnet_Membership tablolarındaki her kullanıcı hakkındaki bilgiler AspnetUsers tablosunun sütunlarına kopyalanır. Burada yapılan tek değişiklik, parolayı kopyalamamızdır. SQL üyeliğindeki parolalar için şifreleme algoritması 'PasswordSalt' ve 'PasswordFormat' kullandığından, parolanın şifresini Identity ile çözmek için kullanılabilmesi için bunu da karma parolayla birlikte kopyalarız. Bu, özel bir parola hasher'i bağlarken makalede daha ayrıntılı olarak açıklanmıştır.

Bu betik dosyası bu örne özeldir. Ek tabloları olan uygulamalar için geliştiriciler, kullanıcı modeli sınıfına ek özellikler eklemek ve bunları AspnetUsers tablosundaki sütunlara eşlemek için benzer bir yaklaşımı izleyebilir. Betiği çalıştırmak için

  1. Sunucu Gezgini'ne gidin. Tabloları görüntülemek için 'ApplicationServices' bağlantısını genişletin. Tablolar düğümüne sağ tıklayın ve 'Yeni Sorgu' seçeneğini belirleyin

    Tabloları görüntülemek üzere Uygulama Hizmetleri bağlantısını genişletmek için Sunucu Gezgini'ni Aç'ın ekran görüntüsü.

  2. Sorgu penceresinde, Migrations.sql dosyasındaki SQL betiğinin tamamını kopyalayıp yapıştırın. 'Yürüt' ok düğmesine basarak betik dosyasını çalıştırın.

    S Q L betiğinin tamamını kopyalayıp yapıştırmak için sorgu penceresinin ekran görüntüsü.

    Sunucu Gezgini penceresini yenileyin. Veritabanında beş yeni tablo oluşturulur.

    Veritabanında beş yeni tablo oluşturmak için Sunucu Gezgini penceresini yenileme işleminin ekran görüntüsü.

    Veri Bağlantılarındaki Tabloların ekran görüntüsü.

    Aşağıda, SQL üyelik tablolarındaki bilgilerin yeni Kimlik sistemiyle nasıl eşlendiği gösterilir.

    aspnet_Roles --> AspNetRoles

    asp_netUsers ve asp_netMembership --> AspNetUsers

    aspnet_UserInRoles --> AspNetUserRoles

    Yukarıdaki bölümde açıklandığı gibi AspNetUserClaims ve AspNetUserLogins tabloları boş. AspNetUser tablosundaki 'Discriminator' alanı, bir sonraki adım olarak tanımlanan model sınıfı adıyla eşleşmelidir. Ayrıca PasswordHash sütunu 'şifrelenmiş parola |parola tuzu|parola biçimi' biçimindedir. Bu, eski parolaları yeniden kullanabilmeniz için özel SQL üyeliği şifreleme mantığı kullanmanızı sağlar. Bu, makalenin devamında açıklanmıştır.

Model ve üyelik sayfaları oluşturma

Daha önce belirtildiği gibi, Kimlik özelliği varsayılan olarak hesap bilgilerini depolamak üzere veritabanıyla konuşmak için Entity Framework kullanır. Tablodaki mevcut verilerle çalışmak için, tablolara geri eşlenen model sınıfları oluşturmamız ve bunları Kimlik sisteminde bağlamamız gerekir. Kimlik sözleşmesinin bir parçası olarak, model sınıfları Identity.Core dll dosyasında tanımlanan arabirimleri uygulamalı veya Microsoft.AspNet.Identity.EntityFramework'te bulunan bu arabirimlerin mevcut uygulamasını genişletebilir.

Örneğimizde AspNetRoles, AspNetUserClaims, AspNetLogins ve AspNetUserRole tablolarında, Kimlik sisteminin mevcut uygulamasına benzer sütunlar bulunur. Bu nedenle mevcut sınıfları bu tablolarla eşlemek için yeniden kullanabiliriz. AspNetUser tablosunda, SQL üyelik tablolarından ek bilgileri depolamak için kullanılan bazı ek sütunlar vardır. Bu, mevcut 'IdentityUser' uygulamasını genişleten ve ek özellikleri ekleyen bir model sınıfı oluşturularak eşlenebilir.

  1. Projede bir Models klasörü oluşturun ve User sınıfını ekleyin. Sınıfın adı, 'AspnetUsers' tablosunun 'Discriminator' sütununa eklenen verilerle eşleşmelidir.

    Projede Models klasörü oluşturma ve User sınıfı ekleme işleminin ekran görüntüsü.

    User sınıfı , Microsoft.AspNet.Identity.EntityFramework dll dosyasında bulunan IdentityUser sınıfını genişletmelidir. AspNetUser sütunlarına geri eşleyen sınıftaki özellikleri bildirin. Id, Username, PasswordHash ve SecurityStamp özellikleri IdentityUser içinde tanımlanır ve bu nedenle atlanır. Tüm özelliklere sahip User sınıfının kodu aşağıdadır

    public class User : IdentityUser
    {
        public User()
        {
            CreateDate = DateTime.Now;
            IsApproved = false;
            LastLoginDate = DateTime.Now;
            LastActivityDate = DateTime.Now;
            LastPasswordChangedDate = DateTime.Now;
            LastLockoutDate = DateTime.Parse("1/1/1754");
            FailedPasswordAnswerAttemptWindowStart = DateTime.Parse("1/1/1754");
            FailedPasswordAttemptWindowStart = DateTime.Parse("1/1/1754");
        }
    
        public System.Guid ApplicationId { get; set; }
        public string MobileAlias { get; set; }
        public bool IsAnonymous { get; set; }
        public System.DateTime LastActivityDate { get; set; }
        public string MobilePIN { get; set; }
        public string LoweredEmail { get; set; }
        public string LoweredUserName { get; set; }
        public string PasswordQuestion { get; set; }
        public string PasswordAnswer { get; set; }
        public bool IsApproved { get; set; }
        public bool IsLockedOut { get; set; }
        public System.DateTime CreateDate { get; set; }
        public System.DateTime LastLoginDate { get; set; }
        public System.DateTime LastPasswordChangedDate { get; set; }
        public System.DateTime LastLockoutDate { get; set; }
        public int FailedPasswordAttemptCount { get; set; }
        public System.DateTime FailedPasswordAttemptWindowStart { get; set; }
        public int FailedPasswordAnswerAttemptCount { get; set; }
        public System.DateTime FailedPasswordAnswerAttemptWindowStart { get; set; }
        public string Comment { get; set; }
    }
    
  2. Modellerdeki verileri tablolara geri almak ve modelleri doldurmak için tablolardan veri almak için Entity Framework DbContext sınıfı gereklidir. Microsoft.AspNet.Identity.EntityFramework dll, bilgileri almak ve depolamak için Identity tablolarıyla etkileşim kuran IdentityDbContext sınıfını tanımlar. IdentityDbContext<tuser> , IdentityUser sınıfını genişleten herhangi bir sınıf olabilecek bir 'TUser' sınıfı alır.

    1. adımda oluşturulan 'User' sınıfını geçirerek IdentityDbContext'i 'Models' klasörü altında genişleten yeni bir ApplicationDBContext sınıfı oluşturun

    public class ApplicationDbContext : IdentityDbContext<User>
    {
            
    }
    
  3. Yeni Kimlik sistemindeki kullanıcı yönetimi, Microsoft.AspNet.Identity.EntityFramework dll dosyasında tanımlanan UserManager<tuser> sınıfı kullanılarak gerçekleştirilir. 1. adımda oluşturulan 'User' sınıfını geçirerek UserManager'ı genişleten özel bir sınıf oluşturmamız gerekir.

    Models klasöründe UserManager kullanıcısını genişleten yeni bir UserManager<sınıfı oluşturun>

    public class UserManager : UserManager<User>
    {
            
    }
    
  4. Uygulama kullanıcılarının parolaları şifrelenir ve veritabanında depolanır. SQL üyeliğinde kullanılan şifreleme algoritması, yeni Kimlik sistemindekinden farklıdır. Eski parolaları yeniden kullanmak için, eski kullanıcılar yeni kullanıcılar için Kimlik'teki şifreleme algoritmasını kullanırken SQL üyelikleri algoritmasını kullanarak oturum açtığında parolaların şifresini seçmeli olarak çözmemiz gerekir.

    UserManager sınıfı, 'IPasswordHasher' arabirimini uygulayan bir sınıfın örneğini depolayan 'PasswordHasher' özelliğine sahiptir. Bu, kullanıcı kimlik doğrulaması işlemleri sırasında parolaları şifrelemek/şifresini çözmek için kullanılır. 3. adımda tanımlanan UserManager sınıfında yeni bir SQLPasswordHasher sınıfı oluşturun ve aşağıdaki kodu kopyalayın.

    public class SQLPasswordHasher : PasswordHasher
    {
        public override string HashPassword(string password)
        {
            return base.HashPassword(password);
        }
    
        public override PasswordVerificationResult VerifyHashedPassword(string  hashedPassword, string providedPassword)
        {
            string[] passwordProperties = hashedPassword.Split('|');
            if (passwordProperties.Length != 3)
            {
                return base.VerifyHashedPassword(hashedPassword, providedPassword);
            }
            else
            {
                string passwordHash = passwordProperties[0];
                int passwordformat = 1;
                string salt = passwordProperties[2];
                if (String.Equals(EncryptPassword(providedPassword, passwordformat, salt), passwordHash, StringComparison.CurrentCultureIgnoreCase))
                {
                    return PasswordVerificationResult.SuccessRehashNeeded;
                }
                else
                {
                    return PasswordVerificationResult.Failed;
                }
            }
        }
    
        //This is copied from the existing SQL providers and is provided only for back-compat.
        private string EncryptPassword(string pass, int passwordFormat, string salt)
        {
            if (passwordFormat == 0) // MembershipPasswordFormat.Clear
                return pass;
    
            byte[] bIn = Encoding.Unicode.GetBytes(pass);
            byte[] bSalt = Convert.FromBase64String(salt);
            byte[] bRet = null;
    
            if (passwordFormat == 1)
            { // MembershipPasswordFormat.Hashed 
                HashAlgorithm hm = HashAlgorithm.Create("SHA1");
                if (hm is KeyedHashAlgorithm)
                {
                    KeyedHashAlgorithm kha = (KeyedHashAlgorithm)hm;
                    if (kha.Key.Length == bSalt.Length)
                    {
                        kha.Key = bSalt;
                    }
                    else if (kha.Key.Length < bSalt.Length)
                    {
                        byte[] bKey = new byte[kha.Key.Length];
                        Buffer.BlockCopy(bSalt, 0, bKey, 0, bKey.Length);
                        kha.Key = bKey;
                    }
                    else
                    {
                        byte[] bKey = new byte[kha.Key.Length];
                        for (int iter = 0; iter < bKey.Length; )
                        {
                            int len = Math.Min(bSalt.Length, bKey.Length - iter);
                            Buffer.BlockCopy(bSalt, 0, bKey, iter, len);
                            iter += len;
                        }
                        kha.Key = bKey;
                    }
                    bRet = kha.ComputeHash(bIn);
                }
                else
                {
                    byte[] bAll = new byte[bSalt.Length + bIn.Length];
                    Buffer.BlockCopy(bSalt, 0, bAll, 0, bSalt.Length);
                    Buffer.BlockCopy(bIn, 0, bAll, bSalt.Length, bIn.Length);
                    bRet = hm.ComputeHash(bAll);
                }
            }
    
            return Convert.ToBase64String(bRet);
        }
    

    System.Text ve System.Security.Cryptography ad alanlarını içeri aktararak derleme hatalarını çözün.

    EncodePassword yöntemi, parolayı varsayılan SQL üyeliği şifreleme uygulamasına göre şifreler. Bu, System.Web dll dosyasından alınır. Eski uygulama özel bir uygulama kullandıysa buraya yansıtılmalıdır. Belirli bir parolayı karma yapmak veya veritabanında mevcut olan parolayla düz metin parolasını doğrulamak için EncodePassword yöntemini kullanan hashPassword ve VerifyHashedPassword adlı iki yöntem daha tanımlamamız gerekir.

    SQL üyelik sistemi, parolalarını kaydederken veya değiştirirken kullanıcılar tarafından girilen parolayı karma yapmak için PasswordHash, PasswordSalt ve PasswordFormat kullandı. Geçiş sırasında üç alan da AspNetUser tablosundaki PasswordHash sütununda '|' karakteriyle ayrılmış olarak depolanır. Bir kullanıcı oturum açtığında ve parolada bu alanlar varsa, parolayı denetlemek için SQL üyeliği şifrelemesini kullanırız; aksi takdirde, parolayı doğrulamak için Kimlik sisteminin varsayılan şifrelemesini kullanırız. Bu şekilde, uygulama geçirildikten sonra eski kullanıcıların parolalarını değiştirmeleri gerekmez.

  5. UserManager sınıfı için oluşturucuyu bildirin ve bunu oluşturucudaki özelliğine SQLPasswordHasher olarak geçirin.

    public UserManager()
                : base(new UserStore<User>(new ApplicationDbContext()))
    {
                this.PasswordHasher = new SQLPasswordHasher();
    }
    

Yeni hesap yönetimi sayfaları oluşturma

Geçiş işleminin bir sonraki adımı, kullanıcının kaydolmasını ve oturum açmasını sağlayacak hesap yönetimi sayfaları eklemektir. SQL üyeliğindeki eski hesap sayfalarında yeni Kimlik sistemiyle çalışmayan denetimler kullanılır. Projeyi oluşturup NuGet paketlerini eklediğimizden, yeni kullanıcı yönetimi sayfalarını eklemek için 'Uygulamanıza kullanıcı kaydetmek için Web Forms ekleme' adımından başlayarak bu bağlantıdaki https://www.asp.net/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project öğreticiyi izleyin.

Örneğin buradaki projeyle çalışması için bazı değişiklikler yapmamız gerekir.

  • Sınıfların arkasındaki Register.aspx.cs ve Login.aspx.cs kodu, Kullanıcı oluşturmak için Kimlik paketlerinden öğesini kullanır UserManager . Bu örnekte, daha önce belirtilen adımları izleyerek Modeller klasörüne eklenen UserManager'ı kullanın.

  • Sınıfların arkasındaki Register.aspx.cs ve Login.aspx.cs kodlarında IdentityUser yerine oluşturulan User sınıfını kullanın. Bu, özel kullanıcı sınıfımızda Kimlik sistemine takılır.

  • Veritabanını oluşturma bölümü atlanabilir.

  • Geliştiricinin, yeni kullanıcının geçerli uygulama kimliğiyle eşleşmesi için ApplicationId değerini ayarlaması gerekir. Bu, Register.aspx.cs sınıfında bir kullanıcı nesnesi oluşturulmadan önce bu uygulama için ApplicationId sorgulanarak ve kullanıcı oluşturmadan önce ayarlanarak yapılabilir.

    Örnek:

    aspnet_Applications tablosunu sorgulamak ve uygulama adına göre uygulama kimliğini almak için Register.aspx.cs sayfasında bir yöntem tanımlayın

    private Guid GetApplicationID()
    {
        using (SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString))
        {
            string queryString = "SELECT ApplicationId from aspnet_Applications WHERE ApplicationName = '/'"; //Set application name as in database
    
            SqlCommand command = new SqlCommand(queryString, connection);
            command.Connection.Open();
    
            var reader = command.ExecuteReader();
            while (reader.Read())
            {
                return reader.GetGuid(0);
            }
    
            return Guid.NewGuid();
        }
    }
    

    Şimdi bunu kullanıcı nesnesinde ayarlayın

    var currentApplicationId = GetApplicationID();
    
    User user = new User() { UserName = Username.Text,
    ApplicationId=currentApplicationId, …};
    

Mevcut bir kullanıcının oturumunu açmak için eski kullanıcı adını ve parolayı kullanın. Yeni kullanıcı oluşturmak için Kaydet sayfasını kullanın. Ayrıca kullanıcıların beklendiği gibi rollerde olduğunu doğrulayın.

Kimlik sistemine taşıma, kullanıcının uygulamaya Açık Kimlik Doğrulaması (OAuth) eklemesine yardımcı olur. Lütfen burada OAuth'un etkinleştirildiği örne bakın.

Sonraki Adımlar

Bu öğreticide kullanıcıların SQL üyeliğinden ASP.NET Identity'ye nasıl taşınabilir olduğunu gösterdik, ancak Profil verilerini taşımadık. Sonraki öğreticide, Profil verilerini SQL üyeliğinden yeni Kimlik sistemine taşımayı inceleyeceğiz.

Bu makalenin en altına geri bildirim bırakabilirsiniz.

Makaleyi gözden geçirdikleri için Tom Dykstra ve Rick Anderson'a teşekkür ederiz.