Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Pranav Rastogi, Rick Anderson, Robert McMurray, Suhas Joshi
Tutorial ini menjelaskan langkah-langkah yang diperlukan untuk memigrasikan data pengguna dan peran serta data profil pengguna yang dibuat menggunakan Penyedia Universal dari aplikasi yang ada ke model identitas ASP.NET. Pendekatan yang disebutkan di sini untuk memigrasikan data profil pengguna juga dapat digunakan dalam aplikasi dengan keanggotaan SQL.
Dengan dirilisnya Visual Studio 2013, tim ASP.NET memperkenalkan sistem identitas ASP.NET baru, dan Anda dapat membaca selengkapnya tentang rilis tersebut di sini. Menindaklanjuti artikel untuk memigrasikan aplikasi web dari Keanggotaan SQL ke sistem Identitas baru, artikel ini menggambarkan langkah-langkah untuk memigrasikan aplikasi yang ada yang mengikuti model Penyedia untuk manajemen pengguna dan peran ke model Identitas baru. Fokus tutorial ini terutama akan memigrasikan data profil pengguna untuk mengaitkannya dengan mulus ke dalam sistem baru. Memigrasikan informasi pengguna dan peran serupa untuk keanggotaan SQL. Pendekatan yang diikuti untuk memigrasikan data profil juga dapat digunakan dalam aplikasi dengan keanggotaan SQL.
Sebagai contoh, kita akan mulai dengan aplikasi web yang dibuat menggunakan Visual Studio 2012 yang menggunakan model Penyedia. Kami kemudian akan menambahkan kode untuk manajemen profil, mendaftarkan pengguna, menambahkan data profil untuk pengguna, memigrasikan skema database, lalu mengubah aplikasi untuk menggunakan sistem Identitas untuk manajemen pengguna dan peran. Sebagai pengujian migrasi, pengguna yang dibuat menggunakan Penyedia Universal harus dapat masuk dan pengguna baru harus dapat mendaftar.
Catatan
Anda dapat menemukan sampel lengkap di https://github.com/suhasj/UniversalProviders-Identity-Migrations.
Ringkasan migrasi data profil
Sebelum memulai dengan migrasi, mari kita lihat pengalaman menyimpan data profil dalam model Penyedia. Data profil untuk pengguna aplikasi dapat disimpan dalam berbagai cara, yang paling umum di antara mereka menggunakan penyedia profil bawaan yang dikirim bersama dengan Penyedia Universal. Langkah-langkahnya akan mencakup
- Tambahkan kelas yang memiliki properti yang digunakan untuk menyimpan data Profil.
- Tambahkan kelas yang memperluas 'ProfileBase' dan menerapkan metode untuk mendapatkan data profil di atas untuk pengguna.
- Aktifkan menggunakan penyedia profil default dalam file web.config dan tentukan kelas yang dideklarasikan di langkah #2 untuk digunakan dalam mengakses informasi profil.
Informasi profil disimpan sebagai xml serial dan data biner dalam tabel 'Profil' dalam database.
Setelah memigrasikan aplikasi untuk menggunakan sistem identitas ASP.NET baru, informasi profil dideserialisasi dan disimpan sebagai properti di kelas pengguna. Setiap properti kemudian dapat dipetakan ke kolom dalam tabel pengguna. Keuntungannya di sini adalah bahwa properti dapat dikerjakan secara langsung menggunakan kelas pengguna selain tidak harus menserialisasikan/mendeserialisasi informasi data setiap kali saat mengaksesnya.
Memulai
Buat aplikasi ASP.NET 4.5 Web Forms baru di Visual Studio 2012. Sampel saat ini menggunakan templat Formulir Web, tetapi Anda juga dapat menggunakan Aplikasi MVC.
Membuat folder baru 'Model' untuk menyimpan informasi profil
Sebagai contoh, mari kita simpan tanggal lahir, kota, tinggi dan berat pengguna di profil. Tinggi dan berat disimpan sebagai kelas kustom yang disebut 'PersonalStats'. Untuk menyimpan dan mengambil profil, kita memerlukan kelas yang memperluas 'ProfileBase'. Mari kita buat kelas baru 'AppProfile' untuk mendapatkan dan menyimpan informasi profil.
public class ProfileInfo { public ProfileInfo() { UserStats = new PersonalStats(); } public DateTime? DateOfBirth { get; set; } public PersonalStats UserStats { get; set; } public string City { get; set; } } public class PersonalStats { public int? Weight { get; set; } public int? Height { get; set; } } public class AppProfile : ProfileBase { public ProfileInfo ProfileInfo { get { return (ProfileInfo)GetPropertyValue("ProfileInfo"); } } public static AppProfile GetProfile() { return (AppProfile)HttpContext.Current.Profile; } public static AppProfile GetProfile(string userName) { return (AppProfile)Create(userName); } }
Aktifkan profil dalam file web.config . Masukkan nama kelas yang akan digunakan untuk menyimpan/mengambil informasi pengguna yang dibuat di langkah #3.
<profile defaultProvider="DefaultProfileProvider" enabled="true" inherits="UniversalProviders_ProfileMigrations.Models.AppProfile"> <providers> ..... </providers> </profile>
Tambahkan halaman formulir web di folder 'Akun' untuk mendapatkan data profil dari pengguna dan menyimpannya. Klik kanan pada proyek dan pilih 'Tambahkan Item baru'. Tambahkan halaman webforms baru dengan halaman master 'AddProfileData.aspx'. Salin yang berikut ini di bagian 'MainContent':
<h2> Add Profile Data for <%# User.Identity.Name %></h2> <asp:Label Text="" ID="Result" runat="server" /> <div> Date of Birth: <asp:TextBox runat="server" ID="DateOfBirth"/> </div> <div> Weight: <asp:TextBox runat="server" ID="Weight"/> </div> <div> Height: <asp:TextBox runat="server" ID="Height"/> </div> <div> City: <asp:TextBox runat="server" ID="City"/> </div> <div> <asp:Button Text="Add Profile" ID="Add" OnClick="Add_Click" runat="server" /> </div>
Tambahkan kode berikut dalam kode di belakang:
protected void Add_Click(object sender, EventArgs e) { AppProfile profile = AppProfile.GetProfile(User.Identity.Name); profile.ProfileInfo.DateOfBirth = DateTime.Parse(DateOfBirth.Text); profile.ProfileInfo.UserStats.Weight = Int32.Parse(Weight.Text); profile.ProfileInfo.UserStats.Height = Int32.Parse(Height.Text); profile.ProfileInfo.City = City.Text; profile.Save(); }
Tambahkan namespace di mana kelas AppProfile ditentukan untuk menghapus kesalahan kompilasi.
Jalankan aplikasi dan buat pengguna baru dengan nama pengguna 'olduser'. Navigasi ke halaman 'AddProfileData' dan tambahkan informasi profil untuk pengguna.
Anda dapat memverifikasi bahwa data disimpan sebagai xml berseri dalam tabel 'Profil' menggunakan jendela Penjelajah Server. Di Visual Studio, dari menu 'Tampilan', pilih 'Penjelajah Server'. Harus ada koneksi data untuk database yang ditentukan dalam file web.config . Mengklik koneksi data memperlihatkan sub kategori yang berbeda. Perluas 'Tabel' untuk memperlihatkan tabel yang berbeda dalam database Anda, lalu klik kanan 'Profil' dan pilih 'Tampilkan Data Tabel' untuk melihat data profil yang disimpan dalam tabel Profil.
Memigrasikan skema database
Untuk membuat database yang ada berfungsi dengan sistem Identitas, kita perlu memperbarui skema dalam database Identitas untuk mendukung bidang yang kita tambahkan ke database asli. Ini dapat dilakukan menggunakan skrip SQL untuk membuat tabel baru dan menyalin informasi yang ada. Di jendela 'Server Explorer', perluas 'DefaultConnection' untuk menampilkan tabel. Klik kanan Tabel dan pilih 'Kueri Baru'
Tempelkan skrip SQL dari https://raw.github.com/suhasj/UniversalProviders-Identity-Migrations/master/Migration.txt dan jalankan. Jika 'DefaultConnection' disegarkan, kita dapat melihat bahwa tabel baru ditambahkan. Anda dapat memeriksa data di dalam tabel untuk melihat bahwa informasi telah dimigrasikan.
Memigrasikan aplikasi untuk menggunakan identitas ASP.NET
Instal paket Nuget yang diperlukan untuk identitas ASP.NET:
- Microsoft.AspNet.Identity.EntityFramework
- Microsoft.AspNet.Identity.Owin
- Microsoft.Owin.Host.SystemWeb
- Microsoft.Owin.Security.Facebook
- Microsoft.Owin.Security.Google
- Microsoft.Owin.Security.MicrosoftAccount
- Microsoft.Owin.Security.Twitter
Informasi lebih lanjut tentang mengelola paket Nuget dapat ditemukan di sini
Untuk bekerja dengan data yang ada dalam tabel, kita perlu membuat kelas model yang memetakan kembali ke tabel dan menghubungkannya di sistem Identitas. Sebagai bagian dari kontrak Identitas, kelas model harus mengimplementasikan antarmuka yang ditentukan dalam dll Identity.Core atau dapat memperluas implementasi antarmuka yang ada yang tersedia di Microsoft.AspNet.Identity.EntityFramework. Kami akan menggunakan kelas yang ada untuk peran, login pengguna, dan klaim pengguna. Kita perlu menggunakan pengguna kustom untuk sampel kita. Klik kanan pada proyek dan buat folder baru 'IdentityModels'. Tambahkan kelas 'Pengguna' baru seperti yang ditunjukkan di bawah ini:
using Microsoft.AspNet.Identity.EntityFramework; using System; using System.Collections.Generic; using System.Linq; using System.Web; using UniversalProviders_ProfileMigrations.Models; namespace UniversalProviders_Identity_Migrations { public class User : IdentityUser { public User() { CreateDate = DateTime.UtcNow; IsApproved = false; LastLoginDate = DateTime.UtcNow; LastActivityDate = DateTime.UtcNow; LastPasswordChangedDate = DateTime.UtcNow; Profile = new ProfileInfo(); } public System.Guid ApplicationId { get; set; } public bool IsAnonymous { get; set; } public System.DateTime? LastActivityDate { get; set; } public string Email { 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; } public ProfileInfo Profile { get; set; } } }
Perhatikan bahwa 'ProfileInfo' sekarang menjadi properti di kelas pengguna. Oleh karena itu kita dapat menggunakan kelas pengguna untuk langsung bekerja dengan data profil.
Salin file di folder IdentityModels dan IdentityAccount dari sumber unduhan ( https://github.com/suhasj/UniversalProviders-Identity-Migrations/tree/master/UniversalProviders-Identity-Migrations ). Ini memiliki kelas model yang tersisa dan halaman baru yang diperlukan untuk manajemen pengguna dan peran menggunakan ASP.NET Identity API. Pendekatan yang digunakan mirip dengan Keanggotaan SQL dan penjelasan terperinci dapat ditemukan di sini.
Beberapa perintah tidak didukung jika aplikasi menggunakan SQLite sebagai penyimpanan data Identitasnya. Karena keterbatasan dalam mesin database,
Alter
perintah melemparkan pengecualian berikut:"System.NotSupportedException: SQLite tidak mendukung operasi migrasi ini."
Sebagai pekerjaan, jalankan migrasi Kode Pertama pada database untuk mengubah tabel.
Menyalin data Profil ke tabel baru
Seperti disebutkan sebelumnya, kita perlu mendeserialisasi data xml dalam tabel Profil dan menyimpannya di kolom tabel AspNetUsers. Kolom baru dibuat dalam tabel pengguna di langkah sebelumnya sehingga yang tersisa hanyalah mengisi kolom tersebut dengan data yang diperlukan. Untuk melakukan ini, kita akan menggunakan aplikasi konsol yang dijalankan sekali untuk mengisi kolom yang baru dibuat dalam tabel pengguna.
Buat aplikasi konsol baru di solusi keluar.
Instal versi terbaru paket Entity Framework.
Tambahkan aplikasi web yang dibuat di atas sebagai referensi ke aplikasi konsol. Untuk melakukan ini klik kanan pada Project, lalu 'Tambahkan Referensi', lalu Solusi, lalu klik proyek dan klik OK.
Salin kode di bawah ini di kelas Program.cs. Logika ini membaca data profil untuk setiap pengguna, menserialisasikannya sebagai objek 'ProfileInfo' dan menyimpannya kembali ke database.
public class Program { var dbContext = new ApplicationDbContext(); foreach (var profile in dbContext.Profiles) { var stringId = profile.UserId.ToString(); var user = dbContext.Users.Where(x => x.Id == stringId).FirstOrDefault(); Console.WriteLine("Adding Profile for user:" + user.UserName); var serializer = new XmlSerializer(typeof(ProfileInfo)); var stringReader = new StringReader(profile.PropertyValueStrings); var profileData = serializer.Deserialize(stringReader) as ProfileInfo; if (profileData == null) { Console.WriteLine("Profile data deserialization error for user:" + user.UserName); } else { user.Profile = profileData; } } dbContext.SaveChanges(); }
Beberapa model yang digunakan didefinisikan dalam folder 'IdentityModels' dari proyek aplikasi web, jadi Anda harus menyertakan namespace yang sesuai.
Kode di atas berfungsi pada file database di folder App_Data proyek aplikasi web yang dibuat di langkah-langkah sebelumnya. Untuk mereferensikan itu, perbarui string koneksi dalam file app.config aplikasi konsol dengan string koneksi di web.config aplikasi web. Berikan juga jalur fisik lengkap di properti 'AttachDbFilename'.
Buka prompt perintah dan navigasi ke folder bin aplikasi konsol di atas. Jalankan executable dan tinjau output log seperti yang ditunjukkan pada gambar berikut.
Buka tabel 'AspNetUsers' di Server Explorer dan verifikasi data di kolom baru yang menyimpan properti. Mereka harus diperbarui dengan nilai properti yang sesuai.
Memverifikasi fungsionalitas
Gunakan halaman keanggotaan yang baru ditambahkan yang diimplementasikan menggunakan ASP.NET Identity untuk masuk ke pengguna dari database lama. Pengguna harus dapat masuk menggunakan kredensial yang sama. Coba fungsionalitas lain seperti menambahkan OAuth, membuat pengguna baru, mengubah kata sandi, menambahkan peran, menambahkan pengguna ke peran, dll.
Data Profil untuk pengguna lama dan pengguna baru harus diambil dan disimpan dalam tabel pengguna. Tabel lama tidak boleh lagi dirujuk.
Kesimpulan
Artikel ini menjelaskan proses migrasi aplikasi web yang menggunakan model penyedia untuk keanggotaan ke ASP.NET Identity. Artikel ini juga menguraikan migrasi data profil bagi pengguna untuk dikaitkan ke dalam sistem Identitas. Silakan tinggalkan komentar di bawah ini untuk pertanyaan dan masalah yang dihadapi saat Anda memigrasikan aplikasi Anda.
Terima kasih kepada Rick Anderson dan Robert McMurray karena telah meninjau artikel ini.