Bagikan melalui


Pengantar Identitas ASP.NET

Sistem keanggotaan ASP.NET diperkenalkan dengan ASP.NET 2.0 kembali pada tahun 2005, dan sejak itu ada banyak perubahan dalam cara aplikasi web biasanya menangani autentikasi dan otorisasi. ASP.NET Identity adalah tampilan baru tentang sistem keanggotaan ketika Anda membangun aplikasi modern untuk web, ponsel, atau tablet.

Sebaiknya gunakan opsi autentikasi aman yang paling aman. Untuk aplikasi .NET yang disebarkan ke Azure, lihat:

Azure Key Vault dan .NET Aspire menyediakan cara paling aman untuk menyimpan dan mengambil rahasia. Azure Key Vault adalah layanan cloud yang melindungi kunci enkripsi dan rahasia seperti sertifikat, string koneksi, dan kata sandi. Untuk .NET Aspire, lihat komunikasi Aman antara hosting dan integrasi klien.

Hindari Pemberian Kredensial Kata Sandi Pemilik Sumber Daya karena:

  • Mengekspos kata sandi pengguna ke klien.
  • Adalah risiko keamanan yang signifikan.
  • Hanya boleh digunakan ketika alur autentikasi lain tidak dimungkinkan.

Saat aplikasi disebarkan ke server pengujian, variabel lingkungan dapat digunakan untuk mengatur string koneksi ke server database pengujian. Variabel lingkungan umumnya disimpan dalam teks biasa dan tidak terenkripsi. Jika mesin atau proses disusupi, variabel lingkungan dapat diakses oleh pihak yang tidak tepercaya. Sebaiknya jangan gunakan variabel lingkungan untuk menyimpan string koneksi produksi karena ini bukan pendekatan yang paling aman.

Panduan data konfigurasi:

  • Jangan pernah menyimpan kata sandi atau data sensitif lainnya dalam kode penyedia konfigurasi atau dalam file konfigurasi teks biasa.
  • Jangan gunakan rahasia produksi di lingkungan pengembangan atau pengujian.
  • Tentukan rahasia di luar proyek sehingga tidak dapat diterapkan secara tidak sengaja ke repositori kode sumber.

Latar Belakang: Keanggotaan di ASP.NET

Keanggotaan ASP.NET

Keanggotaan ASP.NET dirancang untuk memenuhi persyaratan keanggotaan situs yang umum pada tahun 2005, yang melibatkan autentikasi berbasis formulir dan database SQL Server untuk nama pengguna, kata sandi, dan informasi profil. Saat ini ada berbagai opsi penyimpanan data yang jauh lebih luas untuk aplikasi web, dan sebagian besar pengembang ingin memungkinkan situs mereka menggunakan penyedia identitas sosial untuk fungsionalitas autentikasi dan otorisasi. Keterbatasan desain Keanggotaan ASP.NET membuat transisi ini sulit:

  • Skema database dirancang untuk SQL Server dan Anda tidak dapat mengubahnya. Anda dapat menambahkan informasi profil, tetapi data tambahan dikemas ke dalam tabel yang berbeda, yang membuatnya sulit untuk diakses dengan cara apa pun kecuali melalui API Penyedia Profil.
  • Sistem penyedia memungkinkan Anda mengubah penyimpanan data backing, tetapi sistem dirancang di sekitar asumsi yang sesuai untuk database relasional. Anda dapat menulis penyedia untuk menyimpan informasi keanggotaan dalam mekanisme penyimpanan non-relasional, seperti Azure Storage Tables. Namun, Anda harus mengatasi desain relasional dengan menulis banyak kode dan banyak pengecualian System.NotImplementedException untuk metode yang tidak berlaku bagi database NoSQL.
  • Karena fungsionalitas masuk/keluar didasarkan pada Autentikasi Formulir, sistem keanggotaan tidak dapat menggunakan OWIN. OWIN menyertakan komponen middleware untuk autentikasi, termasuk dukungan untuk masuk menggunakan penyedia identitas eksternal (seperti Akun Microsoft, Facebook, Google, Twitter), dan masuk menggunakan akun organisasi dari Active Directory lokal atau Azure Active Directory. OWIN juga mencakup dukungan untuk OAuth 2.0, JWT dan CORS.

Keanggotaan Sederhana ASP.NET

ASP.NET keanggotaan sederhana dikembangkan sebagai sistem keanggotaan untuk Halaman Web ASP.NET. Ini dirilis dengan WebMatrix dan Visual Studio 2010 SP1. Tujuan Dari Keanggotaan Sederhana adalah untuk memudahkan untuk menambahkan fungsionalitas keanggotaan ke aplikasi Halaman Web.

Keanggotaan Sederhana memang memudahkan untuk menyesuaikan informasi profil pengguna, tetapi masih berbagi masalah lain dengan Keanggotaan ASP.NET, dan memiliki beberapa batasan:

  • Sulit untuk menyimpan data sistem keanggotaan secara permanen di penyimpanan non-relasional.
  • Anda tidak dapat menggunakannya dengan OWIN.
  • Ini tidak berfungsi dengan baik dengan penyedia Keanggotaan ASP.NET yang ada, dan tidak dapat diperluas.

Penyedia Universal ASP.NET

ASP.NET Penyedia Universal dikembangkan untuk memungkinkan untuk mempertahankan informasi keanggotaan di Microsoft Azure SQL Database, dan mereka juga bekerja dengan SQL Server Compact. Penyedia Universal dibangun di Atas Kode Kerangka Kerja Entitas Terlebih Dahulu, yang berarti bahwa Penyedia Universal dapat digunakan untuk mempertahankan data di penyimpanan apa pun yang didukung oleh EF. Dengan Penyedia Universal, skema database juga dibersihkan cukup banyak.

Penyedia Universal dibangun di atas infrastruktur Keanggotaan ASP.NET, sehingga mereka masih memiliki batasan yang sama dengan Penyedia SqlMembership. Artinya, mereka dirancang untuk database relasional dan sulit untuk menyesuaikan profil dan informasi pengguna. Penyedia ini juga masih menggunakan Autentikasi Formulir untuk fungsionalitas masuk dan keluar.

Identitas ASP.NET

Ketika kisah keanggotaan di ASP.NET telah berkembang selama bertahun-tahun, tim ASP.NET telah belajar banyak dari umpan balik dari pelanggan.

Asumsi bahwa pengguna akan masuk dengan memasukkan nama pengguna dan kata sandi yang telah mereka daftarkan di aplikasi Anda sendiri tidak lagi valid. Web telah menjadi lebih sosial. Pengguna berinteraksi satu sama lain secara real time melalui saluran sosial seperti Facebook, Twitter, dan situs web sosial lainnya. Pengembang ingin pengguna dapat masuk dengan identitas sosial mereka sehingga mereka dapat memiliki pengalaman yang kaya di situs web mereka. Sistem keanggotaan modern harus memungkinkan masuk dengan pengalihan ke penyedia autentikasi seperti Facebook, Twitter, dan lainnya.

Seiring berkembangnya pengembangan web, begitu juga pola pengembangan web. Pengujian unit kode aplikasi menjadi perhatian inti bagi pengembang aplikasi. Pada tahun 2008 ASP.NET menambahkan kerangka kerja baru berdasarkan pola Model-View-Controller (MVC), sebagian untuk membantu pengembang membangun unit yang dapat diuji ASP.NET aplikasi. Pengembang yang ingin melakukan pengujian unit pada logika aplikasi mereka juga ingin melakukannya dengan sistem keanggotaan.

Mempertimbangkan perubahan ini dalam pengembangan aplikasi web, ASP.NET Identity dikembangkan dengan tujuan berikut:

  • Sistem Identitas One ASP.NET

    • ASP.NET Identity dapat digunakan dengan semua kerangka kerja ASP.NET, seperti ASP.NET MVC, Web Forms, Web Pages, Web API, dan SignalR.
    • ASP.NET Identity dapat digunakan saat Anda membangun aplikasi web, telepon, penyimpanan, atau hibrid.
  • Kemudahan dalam memasukkan data profil pengguna

    • Anda memiliki kontrol atas skema informasi pengguna dan profil. Misalnya, Anda dapat dengan mudah mengaktifkan sistem untuk menyimpan tanggal lahir yang dimasukkan oleh pengguna saat mereka mendaftarkan akun di aplikasi Anda.
  • kontrol persistensi

    • Secara default, sistem identitas ASP.NET menyimpan semua informasi pengguna dalam database. ASP.NET Identity menggunakan Kode Kerangka Kerja Entitas Terlebih Dahulu untuk mengimplementasikan semua mekanisme persistensinya.
    • Karena Anda mengontrol skema database, tugas umum seperti mengubah nama tabel atau mengubah jenis data kunci primer mudah dilakukan.
    • Sangat mudah untuk menyambungkan mekanisme penyimpanan yang berbeda seperti SharePoint, Azure Storage Table Service, database NoSQL, dll., tanpa harus melemparkan pengecualian System.NotImplementedExceptions.
  • kemudahan pengujian unit

    • ASP.NET Identity membuat aplikasi web lebih mudah diuji. Anda dapat menulis pengujian unit untuk bagian aplikasi Anda yang menggunakan ASP.NET Identity.
  • penyedia peran

    • Ada penyedia peran yang memungkinkan Anda membatasi akses ke bagian aplikasi Anda berdasarkan peran. Anda dapat dengan mudah membuat peran seperti "Admin" dan menambahkan pengguna ke peran.
  • Berbasis Klaim

    • ASP.NET Identity mendukung autentikasi berbasis klaim, di mana identitas pengguna diwakili sebagai serangkaian klaim. Klaim memungkinkan pengembang untuk jauh lebih ekspresif dalam menjelaskan identitas pengguna daripada peran yang diizinkan. Sementara keanggotaan peran hanya boolean (anggota atau non-anggota), klaim dapat menyertakan informasi yang mendetail tentang identitas dan keanggotaan pengguna.
  • Penyedia Login Sosial

    • Anda dapat dengan mudah menambahkan log masuk sosial seperti Akun Microsoft, Facebook, Twitter, Google, dan lainnya ke aplikasi Anda, dan menyimpan data khusus pengguna di aplikasi Anda.
  • Integrasi OWIN

    • ASP.NET autentikasi sekarang didasarkan pada middleware OWIN yang dapat digunakan pada host berbasis OWIN apa pun. ASP.NET Identity tidak memiliki dependensi apa pun pada System.Web. Ini adalah kerangka kerja OWIN yang sepenuhnya sesuai dan dapat digunakan dalam aplikasi yang dihosting OWIN.
    • ASP.NET Identity menggunakan Autentikasi OWIN untuk masuk/keluar dari pengguna di situs web. Ini berarti bahwa alih-alih menggunakan FormsAuthentication untuk menghasilkan cookie, aplikasi menggunakan OWIN CookieAuthentication untuk melakukannya.
  • paket NuGet

    • ASP.NET Identity didistribusikan ulang sebagai paket NuGet yang diinstal di templat MVC, Web Forms, dan Web API ASP.NET yang dikirim dengan Visual Studio 2017. Anda dapat mengunduh paket NuGet ini dari galeri NuGet.
    • Merilis ASP.NET Identity sebagai paket NuGet memudahkan tim ASP.NET untuk melakukan iterasi pada fitur baru dan perbaikan bug, dan mengirimkannya kepada pengembang dengan cara yang gesar.

Mulai menggunakan identitas ASP.NET

ASP.NET Identity digunakan dalam templat proyek Visual Studio 2017 untuk ASP.NET MVC, Formulir Web, API Web, dan SPA. Dalam panduan ini, kita akan mengilustrasikan bagaimana templat proyek menggunakan ASP.NET Identity untuk menambahkan fungsionalitas untuk mendaftar, masuk, dan mengeluarkan pengguna.

ASP.NET Identity diimplementasikan menggunakan prosedur berikut. Tujuan artikel ini adalah untuk memberi Anda gambaran umum tingkat tinggi tentang identitas ASP.NET; Anda dapat mengikutinya langkah demi langkah atau hanya membaca detailnya. Untuk petunjuk lebih rinci tentang membuat aplikasi menggunakan ASP.NET Identity, termasuk menggunakan API baru untuk menambahkan pengguna, peran, dan informasi profil, lihat bagian Langkah Berikutnya di akhir artikel ini.

  1. Buat aplikasi MVC ASP.NET dengan Akun Individual. Anda dapat menggunakan Identitas ASP.NET di ASP.NET MVC, Formulir Web, API Web, SignalR, dll. Dalam artikel ini kita akan mulai dengan aplikasi MVC ASP.NET.

    Gambar jendela proyek ASP dot Net baru

  2. Proyek yang dibuat berisi tiga paket berikut untuk identitas ASP.NET.

    • Microsoft.AspNet.Identity.EntityFramework
      Paket ini memiliki implementasi Entity Framework ASP.NET Identity yang akan mempertahankan data dan skema Identitas ASP.NET ke SQL Server.
    • Microsoft.AspNet.Identity.Core
      Paket ini memiliki antarmuka inti untuk ASP.NET Identity. Paket ini dapat digunakan untuk menulis implementasi untuk identitas ASP.NET yang menargetkan penyimpanan persistensi yang berbeda seperti Azure Table Storage, database NoSQL, dll.
    • Microsoft.AspNet.Identity.OWIN
      Paket ini berisi fungsionalitas yang digunakan untuk menyambungkan autentikasi OWIN dengan ASP.NET Identity di aplikasi ASP.NET. Ini digunakan saat Anda menambahkan fungsionalitas masuk ke aplikasi Anda dan memanggil middleware OWIN Cookie Authentication untuk menghasilkan cookie.
  3. Membuat pengguna.
    Luncurkan aplikasi lalu klik tautan Daftarkan untuk membuat pengguna. Gambar berikut menunjukkan halaman Daftar yang mengumpulkan nama pengguna dan kata sandi.

    Gambar buat akun baru

    Saat pengguna memilih tombol Daftarkan, tindakan Register pengendali Akun membuat pengguna dengan memanggil ASP.NET Identity API, seperti yang disorot di bawah ini:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Masuk
    Jika pengguna berhasil dibuat, ia diloginkan menggunakan metode SignInAsync.

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    Metode SignInManager.SignInAsync menghasilkan ClaimsIdentity. Karena ASP.NET Identity dan OWIN Cookie Authentication adalah sistem berbasis klaim, kerangka kerja mengharuskan aplikasi untuk menghasilkan ClaimsIdentity untuk pengguna. ClaimsIdentity memiliki informasi tentang semua klaim untuk pengguna, seperti peran apa yang dimiliki pengguna.

  5. Keluar
    Pilih tautan Log off untuk memanggil tindakan LogOff di pengontrol akun.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Kode yang disorot di atas menunjukkan metode AuthenticationManager.SignOut OWIN. Ini dianalogikan dengan metode FormsAuthentication.SignOut yang digunakan oleh modul FormsAuthentication di Formulir Web.

Komponen Identitas ASP.NET

Diagram di bawah ini menunjukkan komponen sistem identitas ASP.NET (pilih ini atau pada diagram untuk memperbesarnya). Paket berwarna hijau membentuk sistem identitas ASP.NET. Semua paket lainnya adalah dependensi yang diperlukan untuk menggunakan sistem identitas ASP.NET dalam aplikasi ASP.NET.

diagram memperlihatkan komponen sistem identitas A S P dot Net

Berikut ini adalah deskripsi singkat tentang paket NuGet yang tidak disebutkan sebelumnya:

  • Microsoft.Owin.Security.Cookies
    Middleware yang memungkinkan aplikasi menggunakan autentikasi berbasis cookie, mirip dengan Autentikasi Formulir ASP.NET.
  • EntityFramework
    Entity Framework adalah teknologi akses data microsoft yang direkomendasikan untuk database relasional.

Migrasi dari Keanggotaan ke Identitas ASP.NET

Kami berharap dapat segera memberikan panduan tentang memigrasikan aplikasi Anda yang ada yang menggunakan Keanggotaan ASP.NET atau Keanggotaan Sederhana ke sistem identitas ASP.NET baru.

Langkah Berikutnya