.NET Core Identity Server 4 Authentication VS Identity Authentication

93

Saya mencoba memahami cara yang tepat untuk melakukan otentikasi di ASP.NET Core. Saya telah melihat beberapa Sumber Daya (Sebagian besar sudah usang).

Beberapa orang memberikan solusi alternatif yang menyatakan untuk menggunakan solusi berbasis cloud seperti Azure AD, atau Menggunakan IdentityServer4 dan menghosting Token Server saya sendiri.

Dalam versi yang lebih lama Dari .Net, salah satu bentuk otentikasi yang lebih sederhana adalah membuat Prinsip I Kustom dan menyimpan data pengguna otentikasi tambahan di dalamnya.

public interface ICustomPrincipal : System.Security.Principal.IPrincipal
{
    string FirstName { get; set; }

    string LastName { get; set; }
}

public class CustomPrincipal : ICustomPrincipal
{
    public IIdentity Identity { get; private set; }

    public CustomPrincipal(string username)
    {
        this.Identity = new GenericIdentity(username);
    }

    public bool IsInRole(string role)
    {
        return Identity != null && Identity.IsAuthenticated && 
           !string.IsNullOrWhiteSpace(role) && Roles.IsUserInRole(Identity.Name, role);
    }

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public string FullName { get { return FirstName + " " + LastName; } }
}

public class CustomPrincipalSerializedModel
{
    public int Id { get; set; }

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

Kemudian Anda akan menyusun data Anda menjadi cookie dan mengembalikannya ke klien.

public void CreateAuthenticationTicket(string username) {     

    var authUser = Repository.Find(u => u.Username == username);  
    CustomPrincipalSerializedModel serializeModel = new CustomPrincipalSerializedModel();

    serializeModel.FirstName = authUser.FirstName;
    serializeModel.LastName = authUser.LastName;
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    string userData = serializer.Serialize(serializeModel);

    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
    1,username,DateTime.Now,DateTime.Now.AddHours(8),false,userData);
    string encTicket = FormsAuthentication.Encrypt(authTicket);
    HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
    Response.Cookies.Add(faCookie);
}

Pertanyaan saya adalah:

  1. Bagaimana saya bisa mengotentikasi mirip dengan cara yang dilakukan di versi sebelumnya. Net apakah cara lama masih berfungsi atau ada versi yang lebih baru.

  2. Apa pro dan kontra menggunakan ayat server token Anda sendiri untuk membuat prinsip kustom Anda sendiri?

  3. Saat menggunakan solusi berbasis cloud atau server Token terpisah, bagaimana Anda akan mengintegrasikannya dengan aplikasi Anda saat ini, apakah saya masih memerlukan tabel pengguna dalam aplikasi saya, bagaimana Anda akan mengaitkan keduanya?

  4. Karena ada begitu banyak solusi berbeda bagaimana saya bisa membuat aplikasi perusahaan, untuk mengizinkan Login melalui Gmail / Facebook sambil tetap bisa memperluas ke SSO lain

  5. Apa sajakah penerapan sederhana dari teknologi ini?
johnny 5
sumber
Pertanyaan ini terlalu luas dan juga sangat berbasis opini. Ada terlalu banyak kemungkinan jawaban, atau jawaban yang bagus akan terlalu panjang untuk format ini. Harap tambahkan detail untuk mempersempit kumpulan jawaban atau untuk memisahkan masalah yang dapat dijawab dalam beberapa paragraf. Banyak pertanyaan bagus menghasilkan opini tertentu berdasarkan pengalaman pakar, tetapi jawaban atas pertanyaan ini cenderung hampir seluruhnya didasarkan pada opini, bukan fakta, referensi, atau keahlian khusus.
Nkosi
@Nkosi maaf ungkapannya seperti itu. Saya mengklarifikasi ini agar lebih spesifik
johnny 5

Jawaban:

146

TL; DR

IdentityServer = enkripsi token dan layanan validasi melalui OAuth 2.0 / OpenId-Connect

ASP.NET Identity = strategi Manajemen Identitas saat ini di ASP.NET

Bagaimana saya bisa mengotentikasi mirip dengan cara yang dilakukan di versi sebelumnya. Net apakah cara lama masih berfungsi atau ada versi yang lebih baru.

Saya tidak melihat alasan mengapa Anda tidak dapat mencapai cara lama di ASP.NET Core, tetapi secara umum, strategi itu diganti dengan ASP.NET Identity, dan ASP.NET Identity masih hidup dan sehat di ASP.NET Core.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity

ASP.NET Identity menggunakan penyimpanan pendukung seperti SQL Server untuk menyimpan informasi pengguna seperti nama pengguna, kata sandi (hash), email, telepon dan mudah diperpanjang untuk menampung Nama Depan, Nama Belakang atau apa pun. Jadi, sebenarnya tidak ada alasan untuk mengenkripsi informasi pengguna ke dalam cookie dan menyebarkannya bolak-balik dari klien ke server. Ini mendukung gagasan seperti klaim pengguna, token pengguna, peran pengguna, dan login eksternal. Berikut adalah entitas dalam Identitas ASP.NET:

  • AspNetUsers
  • AspNetUserRoles
  • AspNetUserClaims
  • AspNetUserLogins (untuk menautkan penyedia identitas eksternal, seperti Google, AAD)
  • AspNetUserTokens (untuk menyimpan hal-hal seperti access_tokens dan refresh_tokens yang dikumpulkan oleh pengguna)

Apa pro dan kontra menggunakan ayat server token Anda sendiri untuk membuat prinsip kustom Anda sendiri?

Server token adalah sistem yang menghasilkan struktur data sederhana yang berisi informasi Otorisasi dan / atau Otentikasi. Otorisasi biasanya mengambil untuk dari sebuah token bernama access_token . Ini akan menjadi "kunci rumah", bisa dikatakan, membiarkan Anda melewati pintu dan masuk ke kediaman sumber daya yang dilindungi, biasanya api web. Untuk Otentikasi, id_tokenberisi pengenal unik untuk pengguna / orang. Meskipun umum untuk menempatkan pengenal seperti itu di access_token, sekarang ada protokol khusus untuk melakukan itu: OpenID-Connect .

Alasan untuk memiliki Security Token Service (STS) Anda sendiri, adalah untuk melindungi aset informasi Anda, melalui kriptografi, dan mengontrol klien (aplikasi) mana yang dapat mengakses sumber daya tersebut. Selain itu, standar untuk kontrol identitas sekarang ada dalam spesifikasi OpenID-Connect. IdentityServer adalah contoh Server Otorisasi OAuth 2.0 yang digabungkan dengan server Autentikasi OpenID-Connect.

Tetapi semua ini tidak diperlukan jika Anda hanya menginginkan tabel pengguna di aplikasi Anda. Anda tidak memerlukan server token - cukup gunakan ASP.NET Identity. ASP.NET Identity memetakan Pengguna Anda ke objek ClaimsIdentity di server- tidak perlu kelas IPrincipal kustom.

Saat menggunakan solusi berbasis cloud atau server Token terpisah, bagaimana Anda akan mengintegrasikannya dengan aplikasi Anda saat ini, apakah saya masih memerlukan tabel pengguna dalam aplikasi saya, bagaimana Anda akan mengaitkan keduanya?

Lihat tutorial ini untuk mengintegrasikan solusi identitas terpisah dengan aplikasi: https://identityserver4.readthedocs.io/en/latest/quickstarts/0_overview.html https://auth0.com/docs/quickstart/webapp/aspnet-core

Minimal Anda memerlukan tabel dua kolom yang memetakan nama pengguna ke pengidentifikasi pengguna penyedia eksternal. Inilah yang tabel AspNetUserLogins lakukan di ASP.NET Identity. Namun, baris dalam tabel itu bergantung pada menjadi catatan Pengguna di AspNetUsers.

ASP.NET Identity mendukung penyedia eksternal seperti Google, Microsoft, Facebook, penyedia OpenID-Connect, Azure AD sudah ada di sana. (Google dan Microsoft telah menerapkan protokol OpenID-Connect sehingga Anda juga tidak memerlukan paket integrasi khusus mereka, seperti yang ini , misalnya). Selain itu, ADFS belum tersedia di ASP.NET Core Identity.

Lihat dokumen ini untuk memulai dengan penyedia eksternal di ASP.NET Identity:

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/

Karena ada begitu banyak solusi berbeda bagaimana saya bisa membuat aplikasi perusahaan, untuk mengizinkan Login melalui Gmail / Facebook sambil tetap bisa memperluas ke SSO lain

Sebagaimana dijelaskan di atas, Identitas ASP.NET sudah melakukan ini. Cukup mudah untuk membuat tabel "Penyedia Eksternal" dan drive data proses login eksternal Anda. Jadi, saat "SSO" baru muncul, cukup tambahkan baris baru dengan properti seperti url penyedia, id klien, dan rahasia yang mereka berikan kepada Anda. Identitas ASP.NET sudah memiliki UI yang dibangun di sana template Visual Studio, tetapi lihat Login Sosial untuk tombol lebih dingin.

Ringkasan

Jika Anda hanya memerlukan tabel pengguna dengan kemampuan masuk kata sandi dan profil pengguna, maka Identitas ASP.NET sempurna. Tidak perlu melibatkan otoritas eksternal. Tetapi, jika memiliki banyak aplikasi yang perlu mengakses banyak API, maka otoritas independen untuk mengamankan dan memvalidasi identitas dan token akses masuk akal. IdentityServer sangat cocok, atau lihat openiddict-core , atau Auth0 untuk solusi cloud.

Permintaan maaf saya adalah ini tidak tepat atau jika terlalu pengantar. Jangan ragu untuk berinteraksi untuk mendapatkan sasaran yang Anda cari.

Tambahan: Otentikasi Cookie

Untuk melakukan otentikasi tanpa tulang dengan cookie, ikuti langkah-langkah berikut. Namun, sepengetahuan saya prinsip klaim khusus tidak didukung. Untuk mencapai efek yang sama, gunakan daftar Klaim ClaimPrincipalobjek.

Buat Aplikasi Web ASP.NET Core 1.1 baru di Visual Studio 2015/2017 memilih "Tanpa Otentikasi" di dialog. Kemudian tambahkan paket:

Microsoft.AspNetCore.Authentication.Cookies

Di bawah Configuremetode di Startup.cstempatkan ini (sebelum app.UseMvc):

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationScheme = "MyCookieMiddlewareInstance",
    LoginPath = new PathString("/Controller/Login/"),
    AutomaticAuthenticate = true,
    AutomaticChallenge = true
});

Kemudian buat ui login dan posting Formulir html ke Metode Tindakan seperti ini:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(String username, String password, String returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        // check user's password hash in database
        // retrieve user info

        var claims = new List<Claim>
        {
            new Claim(ClaimTypes.Name, username),
            new Claim("FirstName", "Alice"),
            new Claim("LastName", "Smith")
        };

        var identity = new ClaimsIdentity(claims, "Password");

        var principal = new ClaimsPrincipal(identity);

        await HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);

        return RedirectToLocal(returnUrl);
    }

    ModelState.AddModelError(String.Empty, "Invalid login attempt.");

    return View();
}

Objek HttpContext.User harus memiliki klaim kustom Anda dan dapat dengan mudah mengambil koleksi Daftar ClaimPrincipal.

Saya harap ini cukup, karena Solusi / Proyek lengkap tampaknya agak berlebihan untuk posting StackOverflow.

travis.js
sumber
1
Tolong tunjukkan contoh penerapan otentikasi di inti
johnny 5
2
Dokumen ASP.NET Core menunjukkan contoh kanonik: docs.microsoft.com/en-us/aspnet/core/security/authentication/… .
travis.js
Jika Anda dapat memposting contoh sederhana otentikasi. Tanpa tautan sehingga orang memiliki sumber daya untuk diakses, saya akan mem-posting jawaban mendalam tentang cara menyiapkan IdentityServer4
johnny 5
Untuk IdentityServer, apakah ini memiliki contoh yang Anda cari: identityserver4.readthedocs.io/en/dev/quickstarts/… ?
travis.js
Untuk ASP.NET Identity, bukankah ini contohnya, atau apakah yang Anda katakan sudah ketinggalan zaman? docs.microsoft.com/en-us/aspnet/core/security/authentication/…
travis.js
11

TL; DR

Saya benar-benar ingin Menampilkan posting lengkap tentang cara menerapkan IdentityServer4 dengan benar tetapi saya mencoba memasukkan Semua Teks ke dalamnya tetapi itu di luar batas dari apa yang Diterima StackOverflow jadi sebagai gantinya saya akan memperbaiki beberapa tip dan hal-hal yang telah saya pelajari.

Apa Manfaat menggunakan Token Server Vs ASP Identity?

Server token, memiliki banyak manfaat, tetapi tidak cocok untuk semua orang. Jika Anda menerapkan solusi seperti perusahaan, di mana Anda ingin banyak klien dapat masuk, server Token adalah pilihan terbaik Anda, tetapi jika Anda hanya membuat situs web sederhana yang ingin mendukung Masuk Eksternal, Anda dapat Pergi Dengan Identitas ASP dan beberapa Middleware.

Identity Server 4 Tips

Identity server 4 didokumentasikan dengan cukup baik dibandingkan dengan banyak kerangka kerja lain yang pernah saya lihat tetapi sulit untuk memulai dari awal dan melihat keseluruhan gambar.

Kesalahan pertama saya mencoba menggunakan OAuth sebagai otentikasi, Ya, ada cara untuk melakukannya tetapi OAuth untuk Otorisasi bukan otentikasi, jika Anda ingin Mengautentikasi gunakan OpenIdConnect (OIDC)

Dalam kasus saya, saya ingin membuat klien javascript, yang terhubung ke api web. Saya melihat banyak solusi, tetapi awalnya saya mencoba menggunakan webapi untuk memanggil Otentikasi terhadap Server Identitas dan hanya akan mempertahankan token itu karena diverifikasi terhadap server. Aliran tersebut berpotensi dapat bekerja tetapi memiliki banyak kekurangan.

Akhirnya aliran yang tepat ketika saya menemukan sampel Klien Javascript saya mendapat aliran yang benar. Klien Anda masuk, dan menyetel token. Kemudian Anda meminta api web Anda menggunakan Klien OIdc, yang akan memverifikasi token akses Anda terhadap IdentityServer.

Menghubungkan ke Toko dan Migrasi Pada awalnya saya memiliki banyak kesalahpahaman dengan migrasi. Saya mendapat kesan bahwa menjalankan migrasi Menghasilkan SQL dari dll secara internal, alih-alih menggunakan Context yang Anda konfigurasikan untuk mencari tahu cara membuat SQL.

Ada dua sintaksis untuk Migrasi yang mengetahui mana yang penting digunakan komputer Anda:

dotnet ef migrations add InitialIdentityServerMigration -c ApplicationDbContext

Add-Migration InitialIdentityServerDbMigration -c ApplicationDbContext

Saya pikir parameter setelah Migrasi adalah nama, mengapa Anda membutuhkan nama Saya tidak yakin, itu ApplicationDbContextadalah DbContext Kode-Pertama di mana Anda ingin membuat.

Migrasi menggunakan beberapa sihir otomatis untuk menemukan Anda String koneksi dari cara memulai Anda dikonfigurasi, saya hanya berasumsi itu menggunakan koneksi dari Server Explorer.

Jika Anda memiliki beberapa proyek, pastikan Anda memiliki proyek dengan ApplicationDbContext yang disetel sebagai permulaan Anda.

Ada banyak bagian yang bergerak saat Menerapkan Otorisasi dan Otentikasi, Semoga posting ini membantu seseorang. Cara termudah untuk memahami otentikasi sepenuhnya adalah dengan memilih contoh mereka untuk mengumpulkan semuanya dan memastikan Anda membaca dokumentasinya

johnny 5
sumber
nama setelah migrasi tambahan adalah referensi yang terkait dengan rilis / perubahan yang Anda buat. nama yang sama akan digunakan untuk menambahkan skrip migrasi Atas & Bawah.
Jay
@Jay Terima kasih untuk klarifikasi itu
johnny 5
Konfigurasi db context server Identity masih belum sebaik IdentityDbContext. membuat implementasi kustom sangat merepotkan. Identityserver 4 sekarang tampaknya tidak banyak aktif untuk merilis update baru setelah update .core.
Jay
3

Identitas ASP.NET - ini adalah cara untuk mengotentikasi aplikasi Anda apakah itu Bearer atau Autentikasi Dasar, Ini memberi kami kode siap pakai untuk melakukan pendaftaran Pengguna, login, mengubah kata sandi, dan semuanya.

Sekarang pertimbangkan kami memiliki 10 aplikasi berbeda dan tidak layak untuk melakukan hal yang sama di semua 10 aplikasi. praktik yang sangat rapuh dan sangat buruk itu.

untuk mengatasi masalah ini yang dapat kami lakukan adalah memusatkan Otentikasi dan otorisasi kami sehingga setiap kali ada perubahan dengan ini tidak akan memengaruhi semua 10 aplikasi kami.

Server identitas memberi Anda kemampuan untuk melakukan hal yang sama. kami dapat membuat satu aplikasi web sampel yang baru saja digunakan sebagai layanan Identity dan itu akan memvalidasi pengguna Anda dan memberikan beberapa token akses JWT.

Amol Aher
sumber
2

Saya selalu menggunakan otorisasi / otentikasi Identitas ASP.NET (dan sebelumnya Keanggotaan) bawaan, saya telah menerapkan Auth0 baru-baru ini ( https://auth0.com ) dan merekomendasikan ini sebagai sesuatu yang lain untuk dicoba.

Mark Redman
sumber
Contoh inti Auth0 .net cukup cepat dan sederhana untuk diimplementasikan, tetapi menggunakan semua fitur membutuhkan sedikit kerja, saya telah menerapkan Auth0 yang mengintegrasikan banyak fitur dan berfungsi dengan baik, tetapi seperti semua hal ini, kebutuhannya ada sedikit kerja keras dan sedikit frustrasi.
Mark Redman
Ketika saya mendapatkan satu otentikasi berfungsi dengan baik, saya akan memposting jawaban mendalam tentang itu. Saya baru saja mengerjakan autentikasi minggu lalu. Dan tidak ada yang sesulit yang seharusnya
johnny 5
0

Login sosial tidak sulit untuk diterapkan dengan Identity, tetapi ada beberapa pengaturan awal yang terlibat dan terkadang langkah-langkah yang Anda temukan online di dokumen tidak identik, biasanya Anda dapat menemukan bantuan untuk itu di bawah bagian pengembang platform yang Anda coba atur login sosial untuk. Identitas adalah pengganti dari fungsionalitas keanggotaan lama yang ditemukan dalam versi lama dari kerangka kerja .net. Yang menurut saya mengejutkan adalah bahwa kasus penggunaan edge, seperti meneruskan token jwt yang sudah Anda miliki ke api web tidak tercakup di mana pun dalam contoh online bahkan dalam bentuk jamak, saya yakin Anda tidak memerlukan otoritas token Anda sendiri untuk melakukan ini, tetapi saya belum menemukan satu contoh pun tentang cara meneruskan data dalam get atau posting yang tidak berhubungan dengan server yang dihosting sendiri.

webdev8183
sumber