Photo by Philipp Katzenberger on Unsplash

Introduction

In my previous post, we learned that OAuth is an authorization framework specially built for HTTP APIs. It allows a user to securely delegate scoped API Access to an application.

By scoped access means, that users define exactly what parts of an API, they want the application to be allowed to use. This…

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.