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

by Rick Anderson, Suwith Joshi

Bu öğreticide, mevcut bir Web uygulamasını yeni ASP.NET Identity sistemine SQL üyeliği kullanılarak oluşturulan kullanıcı ve rol verileriyle geçirme adımları gösterilmektedir. Bu yaklaşım, var olan veritabanı şemasını ASP.NET Identity için gereken bir şekilde değiştirmeyi ve eski/yeni sınıflarda bu sınıfa kancalarını içerir. Bu yaklaşımı benimsediğinizde, veritabanınız geçirildikten sonra, sonraki kimlik güncelleştirmeleri daha kolay bir şekilde ele alınacaktır.

Bu öğreticide, Kullanıcı ve rol verileri oluşturmak için Visual Studio 2010 kullanılarak oluşturulan bir Web uygulaması şablonu (Web Forms) kullanacağız. Daha sonra, mevcut veritabanını kimlik sisteminin gerektirdiği tablolara geçirmek için SQL betikleri kullanacağız. Ardından, gerekli NuGet paketlerini yükleyeceğiz ve Üyelik yönetimi için kimlik sistemini kullanan yeni hesap yönetimi sayfaları ekleyeceğiz. Geçişin bir testi olarak, SQL üyeliği kullanılarak oluşturulan kullanıcıların oturum açabiliyor ve yeni kullanıcıların kayıt yapabilmesi gerekir. Örneğin tamamını burada bulabilirsiniz. Ayrıca bkz. ASP.net üyeliğinden ASP.NET Identity geçirme.

Başlarken

SQL üyeliğiyle uygulama oluşturma

  1. SQL üyeliği kullanan ve Kullanıcı ve rol verilerine sahip olan mevcut bir uygulamayla başlamamız gerekir. Bu makalenin amacı doğrultusunda, Visual Studio 2010 'de bir Web uygulaması oluşturalım.

  2. ASP.NET yapılandırma aracını kullanarak 2 Kullanıcı oluşturun: Oldadminuser ve olduser.

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

  4. Site için default. aspx olan bir yönetici bölümü 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

  5. SQL üyelik sistemi tarafından oluşturulan tabloları anlamak için Sunucu Gezgini veritabanını görüntüleyin. Kullanıcı oturum açma verileri ASPNET _ kullanıcıları ve ASPNET _ Üyelik tablolarında depolanır, rol verileri ASPNET _ Roles tablosunda depolanır. Hangi kullanıcıların, ASPNET usersınroles tablosunda hangi rollerin depolandığı hakkında bilgi _ . Temel üyelik yönetimi için yukarıdaki tablolardaki bilgilerin ASP.NET Identity sistemine bağlantı noktası almak yeterlidir.

Visual Studio 2013 geçiriliyor

  1. Web veya Visual Studio 2013 için Visual Studio Express 2013 ' i en son güncelleştirmelerlebirlikte yükler.

  2. Yukarıdaki projeyi Visual Studio 'nun yüklü sürümünde 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 veya geçici bir çözüm olarak, bağlantı dizesini LocalDb olarak değiştirmeyi seçebilirsiniz. Bu makalede, LocalDb olarak değiştirilecek.

  3. web.config açın ve bağlantı dizesini ' den değiştirin. SQLExpress (LocalDb) v 11.0. Bağlantı dizesinden ' User Instance = true ' değerini kaldırın.

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

  5. ASP.NET Identity sistem Framework sürüm 4,5 veya üzeri sürümlerle birlikte çalışmaktadır. Uygulamayı 4,5 veya daha yüksek bir düzeye yeniden hedefleyin.

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

NuGet paketlerini yükleme

  1. Çözüm Gezgini, proje > NuGet Paketlerini Yönet' e sağ tıklayın. Arama kutusuna "Asp.net Identity" yazın. Sonuçlar listesinden paketi seçin ve ardından yükler ' e 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üklemek (OAuth oturum açma işlemini etkinleştirmek istemiyorsanız son 4 OWIN paketlerini 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

Veritabanını yeni kimlik sistemine geçir

Sonraki adım, mevcut veritabanını ASP.NET Identity sisteminin gerektirdiği bir şemaya geçirmadır. Bunu başarmak için yeni tablolar oluşturmaya ve mevcut kullanıcı bilgilerini yeni tablolara geçirmeye yönelik bir komut kümesine sahip bir SQL betiği çalıştırdık. Betik dosyası buradabulunabilir.

Bu betik dosyası bu örneğe özeldir. SQL üyeliği kullanılarak oluşturulan tablolar için şema özelleştirildiyse veya değiştirilirse betiklerin uygun şekilde değiştirilmesi gerekir.

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

ASP.NET Identity sınıflarının mevcut kullanıcıların verileriyle birlikte çalışması için, veritabanı şemasını ASP.NET Identity için gereken birine geçirmemiz gerekir. Bunu, yeni tablolar ekleyerek ve var olan bilgileri bu tablolara kopyalayarak yapabiliriz. Varsayılan olarak ASP.NET Identity EntityFramework kullanarak kimlik modeli sınıflarını, bilgileri depolamak/almak üzere veritabanına geri eşlemek için 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 v 2.1.0 ve özellikleri içindeki EntityFramework model sınıfları aşağıda tanımlanmıştır

Identityuser Tür Identityrole Identityuserrole Identityuserlogin Identityuserclaim
Id string Id RoleID ProviderKey Id
Kullanıcı adı string Ad UserId UserId ClaimType
PasswordHash string LoginProvider ClaimValue
SecurityStamp string Kullanıcı _ kimliği
E-posta string
Emailonaylandı bool
PhoneNumber string
Phonenumberonaylandı bool
LockoutEnabled bool
LockoutEndDate DateTime
AccessFailedCount int

Özelliklere karşılık gelen sütunlarla bu modellerden her biri için tabloların olması gerekir. Sınıfları ve tabloları arasındaki eşleme OnModelCreating , yöntemi içinde tanımlanmıştır IdentityDBContext . Bu, Fluent API yapılandırma yöntemi olarak bilinir ve buradadaha fazla bilgi bulabilirsiniz. Sınıfların yapılandırması aşağıda belirtilmiştir

Sınıf Tablo Birincil anahtar Yabancı anahtar
Identityuser AspnetUsers Id
Identityrole AspnetRoles Id
Identityuserrole AspnetUserRole UserID + RoleID Kullanıcı _ kimliği- > Aspnetusers RoleID- > aspnetroles
Identityuserlogin AspnetUserLogins ProviderKey + UserID + LoginProvider UserID- > aspnetusers
Identityuserclaim Aspnetuserclaim Id Kullanıcı _ kimliği- > aspnetusers

Bu bilgilerle, yeni tablolar oluşturmak için SQL deyimleri oluşturuyoruz. Her bir ifadeyi ayrı ayrı yazabilir veya daha sonra gerektiği şekilde düzenleyebilmemiz için EntityFramework PowerShell komutlarını kullanarak tüm betiği oluşturabilirsiniz. Bunu yapmak için, VS 'de Görünüm veya Araçlar menüsünden Paket Yöneticisi konsolunu açın

  • EntityFramework geçişlerini etkinleştirmek için "Enable-geçişler" komutunu çalıştırın.
  • C#/vbiçinde veritabanını oluşturmak için ilk kurulum kodunu oluşturan "Add-geçiş Initial" komutunu çalıştırın.
  • Son adım, model sınıflarına dayalı olarak SQL betiğini üreten "güncelleştirme-veritabanı – komut dosyası" komutunu çalıştırmlarıdır.

Uygulamanın kimlik veri deposu olarak SQLite kullanması durumunda bazı komutlar desteklenmez. Veritabanı altyapısından sınırlamalar nedeniyle Alter komutlar 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şleri çalıştırın.

Bu veritabanı oluşturma betiği, yeni sütun eklemek ve veri kopyalamak için ek değişiklikler yapmakta olduğumuz bir başlangıç olarak kullanılabilir. Bunun avantajı, _MigrationHistory model sınıfları kimlik sürümlerinin gelecek sürümleri için değişiklik yaparken, EntityFramework tarafından veritabanı şemasını değiştirmek için kullanılan tabloyu oluşturmamız.

SQL üyeliği kullanıcı bilgilerinin, kimlik Kullanıcı modeli sınıfındaki e-posta, parola denemeleri, son oturum açma tarihi, son kilit kapatma tarihi vb. gibi diğer özellikleri de vardır. Bu, yararlı bilgiler ve kimlik sistemine taşınmasını istiyoruz. Bu, Kullanıcı modeline ek özellikler eklenerek ve bunları veritabanındaki tablo sütunlarına geri eşleyerek yapılabilir. Bunu, modelin alt sınıfı olan bir sınıf ekleyerek yapabiliriz IdentityUser . Bu özel sınıfa özellikleri ekleyebiliyoruz ve tabloyu oluştururken karşılık gelen sütunları eklemek için SQL betiğini düzenleyebiliriz. Bu sınıfın kodu, makalesinde daha ayrıntılı olarak açıklanmıştır. AspnetUsersYeni özellikler eklendikten sonra tablo oluşturmaya YÖNELIK SQL betiği

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]),
);

Daha sonra, mevcut bilgileri SQL üyelik veritabanından kimlik için yeni eklenen tablolara kopyalamanız gerekir. Bu, verileri doğrudan bir tablodan diğerine kopyalayarak SQL üzerinden yapılabilir. Tablo satırlarına veri eklemek için, INSERT INTO [Table] yapısını kullanırız. Başka bir tablodan kopyalamak için, ifadesini INSERT INTO ifadesiyle birlikte kullanabilirsiniz SELECT . ASPNET _ kullanıcıları ve ASPNET _ Üyelik tablolarını sorgulamak ve verileri aspnetusers tablosuna kopyalamak için gereken tüm Kullanıcı bilgilerini almak için. Ve INSERT INTO SELECT deyimleri ile birlikte kullanıyoruz JOIN LEFT OUTER JOIN . Tablolar arasında veri sorgulama ve kopyalama hakkında daha fazla bilgi için Bu bağlantıya başvurun. Ayrıca, SQL üyeliğinde varsayılan olarak buna eşlenen hiçbir bilgi olmadığından, AspnetUserLogins ve Aspnetuserclaim tabloları ile başlamak için boştur. Yalnızca kullanıcılar ve roller için kopyalanmış bilgiler kullanılır. Önceki adımlarda oluşturulan proje için, bilgileri kullanıcılar tablosuna kopyalamak üzere 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 ifadesinde, ASPNET _ kullanıcıları ve ASPNET _ Üyelik tablolarından her bir kullanıcı hakkında bilgi, aspnetusers tablosunun sütunlarına kopyalanır. Burada yapılan tek değişiklik, parolayı kopyalayacağız. SQL üyeliğindeki parolalara yönelik şifreleme algoritması ' password, ' ve ' PasswordFormat ' kullandı, bu sayede parolanın kimliğe göre şifresini çözmek için kullanılabilmesi için onu karma parola ile birlikte kopyalayacağız. Bu, özel bir parola karmacısı oluştururken makalede daha ayrıntılı olarak açıklanmaktadır.

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

  1. Sunucu Gezgini açın. Tabloları göstermek için ' ApplicationServices ' bağlantısını genişletin. Tablolar düğümüne sağ tıklayın ve ' yeni sorgu ' seçeneğini belirleyin

  2. Sorgu penceresinde, tüm SQL betiğini kopyalayıp geçişler. SQL dosyasından yapıştırın. Komut dosyasını ' Yürüt ' ok düğmesine vurarak çalıştırın.

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

    SQL üyelik tablolarındaki bilgilerin yeni kimlik sistemine nasıl eşlendiğine aşağıda verilmiştir.

    ASPNET _ rolleri-- > aspnetroles

    ASP _ netusers ve ASP _ netmembership-- > aspnetusers

    ASPNET _ userınroles-- > aspnetuserroles

    Yukarıdaki bölümde açıklandığı gibi, Aspnetuserclaim ve AspNetUserLogins tabloları boştur. AspNetUser tablosundaki ' ayrıştırıcı ' alanı, bir sonraki adım olarak tanımlanan model sınıfı adıyla eşleşmelidir. Ayrıca, PasswordHash sütunu ' şifreli parola | parola anahtar | parola biçimi ' biçiminde olur. Bu, eski parolaları yeniden kullanabilmeniz için özel SQL üyelik şifreleme mantığını kullanmanıza olanak sağlar. Bu makalede daha sonra makalesinde açıklanmaktadır.

Modeller ve üyelik sayfaları oluşturma

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

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

  1. Projede modeller klasörü oluşturun ve bir sınıf kullanıcısı ekleyin. Sınıfın adı ' AspnetUsers ' tablosunun ' ayrıştırıcı ' sütununda eklenen verilerle eşleşmelidir.

    Kullanıcı sınıfı, Microsoft. Aspnet. Identity. EntityFramework dll dosyasında bulunan ıdentityuser sınıfını genişletmelidir. Bir sınıf içinde AspNetUser sütunlarına geri eşlenen özellikler bildirin. Özellik KIMLIĞI, Kullanıcı adı, PasswordHash ve SecurityStamp, ıdentityuser içinde tanımlanmıştır ve bu nedenle atlanır. Aşağıda, tüm özelliklerine sahip olan Kullanıcı sınıfının kodu verilmiştir

    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 kalıcı hale getirmek ve modelleri doldurmak üzere tablolardan veri almak için Entity Framework DbContext sınıfı gerekir. Microsoft. Aspnet. Identity. EntityFramework dll, bilgileri almak ve depolamak için kimlik tablolarıyla etkileşim kuran ıdentitydbcontext sınıfını tanımlar. Identitydbcontext < Tuser, > ıdentityuser sınıfını genişleten herhangi bir sınıf olabilen bir ' Tuser ' sınıfı alır.

    1. adımda oluşturulan ' user ' sınıfını geçirerek ' modeller ' klasörü altında ıdentitydbcontext ' i 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 yapılır. UserManager 'ı genişleten, 1. adımda oluşturulan ' user ' sınıfını geçirerek, özel bir sınıf oluşturuyoruz.

    Modeller 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 şifre algoritması, yeni kimlik sisteminden farklı. Eski parolaları yeniden kullanmak için, yeni kullanıcılar için kimlik ' de şifre algoritmasını kullanırken eski kullanıcılar SQL üyelik algoritmasını kullanarak oturum açarken parolaların şifresini seçmeli olarak çözmemiz gerekir.

    UserManager sınıfı ' ıpasswordhasher ' arabirimini uygulayan bir sınıfın örneğini depolayan ' PasswordHasher ' özelliğine sahiptir. Bu, Kullanıcı kimlik doğrulama işlemleri sırasında parolaları şifrelemek/şifrelerini çözmek için kullanılır. Adım 3 ' te tanımlanan UserManager sınıfında, SQLPasswordHasher adlı yeni bir 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 üyelik şifre uygulamasına göre şifreler. Bu, System. Web dll 'den alınmıştır. Eski uygulama özel bir uygulama kullanıyorsa buraya yansıtılmalıdır. Belirli bir parolayı karma hale getirmek için Encodepassword metodunu kullanan iki diğer yöntem Hashpassword ve verifyhashedpassword tanımladık veya veritabanında mevcut olan bir düz metin parolasının doğrulanması gerekir.

    SQL üyelik sistemi, parolalarını kaydederken veya değiştirdiklerinde kullanıcılar tarafından girilen parolayı karma hale almak için PasswordHash, Passwordanahtar ve PasswordFormat kullandı. Geçiş sırasında, tüm üç alan, ' | ' karakteriyle ayrılmış olan AspNetUser tablosundaki PasswordHash sütununda depolanır. Bir Kullanıcı oturum açtığında ve parolada bu alanlar varsa, parolayı denetlemek için SQL üyelik şifre ' nu kullanırız; Aksi takdirde, parolayı doğrulamak için kimlik sisteminin varsayılan şifresini kullanırız. Bu sayede, uygulama geçirildikten sonra eski kullanıcıların parolalarını değiştirmesi gerekmez.

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

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

Yeni hesap yönetimi sayfaları oluştur

Geçiş içindeki bir sonraki adım, bir kullanıcının kaydolmasına ve oturum açmasına izin verecek hesap yönetimi sayfaları eklemektir. SQL üyeliğinden eski hesap sayfaları, yeni kimlik sistemiyle çalışmayan denetimleri kullanır. Yeni Kullanıcı Yönetimi sayfalarını eklemek için, https://www.asp.net/identity/overview/getting-started/adding-aspnet-identity-to-an-empty-or-existing-web-forms-project projeyi zaten oluşturmuş ve NuGet paketlerini eklediğimiz için, ' uygulamanıza Kullanıcı ekleme Web Forms ' adımından itibaren bu bağlantıdaki öğreticiyi izleyin.

Burada, örnek için, burada yaptığımız projeyle birlikte çalışmak üzere bazı değişiklikler yapmanız gerekiyor.

  • Register.aspx.cs ve Login.aspx.cs kodu sınıflarının arkasında UserManager bir kullanıcı oluşturmak Için kimlik paketlerinden öğesini kullanır. Bu örnekte, daha önce bahsedilen adımları izleyerek modeller klasörüne eklenen UserManager 'ı kullanın.

  • Register.aspx.cs içinde ıdentityuser yerine oluşturulan kullanıcı sınıfını ve Login.aspx.cs arka plan kodu sınıflarını kullanın. Bu, Özel Kullanıcı sınıfımızda kimlik sistemine kanca oluşturur.

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

  • Geliştiricinin Yeni Kullanıcı için ApplicationId 'yi geçerli uygulama KIMLIĞIYLE eşleşecek şekilde ayarlaması gerekir. Bu, Register.aspx.cs sınıfında bir kullanıcı nesnesi oluşturulmadan ve Kullanıcı oluşturmadan önce ayarlanarak önce bu uygulama için ApplicationId sorgulanarak yapılabilir.

    Örnek:

    Register.aspx.cs sayfasında, ASPNET _ uygulamalar tablosunu sorgulamak ve uygulama adına göre uygulama kimliğini almak için 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 ayarla ' yı al

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

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

Kimlik sistemine taşıma, kullanıcının uygulamaya açık kimlik doğrulaması (OAuth) eklemesini sağlar. Lütfen bu örneğe OAuth etkin olan örneği inceleyin.

Sonraki Adımlar

Bu öğreticide, kullanıcıların SQL üyeliğinden ASP.NET Identity için bağlantı noktası alma, ancak profil verileri için bağlantı noktası yoktu. Sonraki öğreticide, SQL üyeliğinden yeni kimlik sistemine profil verilerini taşıma sayfasına bakacağız.

Bu makalenin en altında geri bildirim alabilirsiniz.

Makaleyi gözden geçirmek için Tom Dykstra ve Rick Anderson için teşekkürler.