Saya bekerja dengan aplikasi ASP.NET Core. Saya mencoba menerapkan Otentikasi Berbasis Token tetapi tidak dapat menemukan cara menggunakan Sistem Keamanan baru untuk kasus saya. Saya telah melalui contoh tetapi mereka tidak banyak membantu saya, mereka menggunakan otentikasi cookie atau otentikasi eksternal (GitHub, Microsoft, Twitter).
Apa skenario saya: aplikasi angularjs harus meminta /token
url lewat nama pengguna dan kata sandi. WebApi harus memberi otorisasi kepada pengguna dan mengembalikan access_token
yang akan digunakan oleh aplikasi angularjs dalam permintaan berikut.
Saya telah menemukan artikel yang bagus tentang mengimplementasikan apa yang saya perlukan dalam versi ASP.NET saat ini - Otentikasi Berbasis Token menggunakan ASP.NET Web API 2, Owin, dan Identity . Tetapi tidak jelas bagi saya bagaimana melakukan hal yang sama di ASP.NET Core.
Pertanyaan saya adalah: bagaimana cara mengkonfigurasi aplikasi ASP.NET Core WebApi agar berfungsi dengan otentikasi berbasis token?
Jawaban:
Pembaruan untuk .Net Core 3.1:
David Fowler (arsitek untuk tim ASP .NET Core) telah mengumpulkan satu set aplikasi tugas yang sangat sederhana, termasuk aplikasi sederhana yang menunjukkan JWT . Saya akan segera memasukkan pembaruan dan gaya sederhana ke pos ini.
Diperbarui untuk .Net Core 2:
Versi sebelumnya dari jawaban ini menggunakan RSA; itu benar-benar tidak perlu jika kode Anda yang sama yang menghasilkan token juga memverifikasi token. Namun, jika Anda membagikan tanggung jawab, Anda mungkin masih ingin melakukan ini menggunakan instance dari
Microsoft.IdentityModel.Tokens.RsaSecurityKey
.Buat beberapa konstanta yang akan kita gunakan nanti; inilah yang saya lakukan:
Tambahkan ini ke Startup.cs's Anda
ConfigureServices
. Kami akan menggunakan injeksi ketergantungan nanti untuk mengakses pengaturan ini. Saya berasumsi bahwa AndaauthenticationConfiguration
adalah objekConfigurationSection
atauConfiguration
sedemikian rupa sehingga Anda dapat memiliki konfigurasi berbeda untuk debug dan produksi. Pastikan Anda menyimpan kunci Anda dengan aman! Itu bisa berupa string apa saja.Saya telah melihat jawaban lain mengubah pengaturan lain, seperti
ClockSkew
; standarnya diatur sedemikian rupa sehingga harus bekerja untuk lingkungan terdistribusi yang jamnya tidak tepat dalam sinkronisasi. Ini adalah satu-satunya pengaturan yang perlu Anda ubah.Siapkan Otentikasi. Anda harus memiliki baris ini sebelum middleware apa pun yang memerlukan
User
info Anda , sepertiapp.UseMvc()
.Perhatikan bahwa ini tidak akan menyebabkan token Anda dipancarkan dengan
SignInManager
atau apa pun. Anda perlu menyediakan mekanisme sendiri untuk mengeluarkan JWT Anda - lihat di bawah.Anda mungkin ingin menentukan
AuthorizationPolicy
. Ini akan memungkinkan Anda untuk menentukan pengontrol dan tindakan yang hanya mengizinkan token Bearer sebagai otentikasi menggunakan[Authorize("Bearer")]
.Inilah bagian yang sulit: membangun token.
Kemudian, di controller Anda di mana Anda ingin token Anda, sesuatu seperti berikut ini:
Di sini, saya berasumsi Anda sudah memiliki kepala sekolah. Jika Anda menggunakan Identity, Anda dapat menggunakan
IUserClaimsPrincipalFactory<>
untuk mengubah AndaUser
menjadi aClaimsPrincipal
.Untuk mengujinya : Dapatkan token, memasukkannya ke dalam formulir di jwt.io . Instruksi yang saya berikan di atas juga memungkinkan Anda untuk menggunakan rahasia dari konfigurasi Anda untuk memvalidasi tanda tangan!
Jika Anda merender ini dalam tampilan parsial pada halaman HTML Anda dalam kombinasi dengan otentikasi hanya pengguna di .Net 4.5, Anda sekarang dapat menggunakan a
ViewComponent
untuk melakukan hal yang sama. Sebagian besar sama dengan kode Action Controller di atas.sumber
IOptions<OAuthBearerAuthenticationOptions>
untuk menggunakan Opsi; menggunakan objek Opsi secara langsung tidak didukung karena konfigurasi bernama yang didukung oleh kerangka Model Opsi.Bekerja dari jawaban luar biasa Matt Dekrey , saya telah membuat contoh yang sepenuhnya berfungsi untuk otentikasi berbasis token, yang bekerja melawan ASP.NET Core (1.0.1). Anda dapat menemukan kode lengkap dalam repositori ini di GitHub (cabang alternatif untuk 1.0.0-rc1 , beta8 , beta7 ), tetapi secara singkat, langkah-langkah penting adalah:
Buat kunci untuk aplikasi Anda
Dalam contoh saya, saya membuat kunci acak setiap kali aplikasi dimulai, Anda harus membuatnya dan menyimpannya di suatu tempat dan menyediakannya untuk aplikasi Anda. Lihat file ini untuk bagaimana saya membuat kunci acak dan bagaimana Anda dapat mengimpornya dari file .json . Seperti yang disarankan dalam komentar oleh @kspearrin, API Perlindungan Data tampaknya merupakan kandidat yang ideal untuk mengelola kunci "dengan benar", tetapi saya belum berhasil jika itu memungkinkan. Silakan kirim permintaan tarik jika Anda berhasil!
Startup.cs - ConfigureServices
Di sini, kita perlu memuat kunci pribadi agar token kita dapat ditandatangani, yang juga akan kita gunakan untuk memverifikasi token seperti yang disajikan. Kami menyimpan kunci dalam variabel tingkat kelas
key
yang akan kami gunakan kembali dalam metode Konfigurasi di bawah ini. TokenAuthOptions adalah kelas sederhana yang memegang identitas penandatangan, pemirsa, dan penerbit yang kita perlukan di TokenController untuk membuat kunci kita.Kami juga telah menetapkan kebijakan otorisasi untuk memungkinkan kami menggunakan
[Authorize("Bearer")]
pada titik akhir dan kelas yang ingin kami lindungi.Startup.cs - Konfigurasikan
Di sini, kita perlu mengkonfigurasi JwtBearerAuthentication:
TokenController
Di pengontrol token, Anda harus memiliki metode untuk menghasilkan kunci yang ditandatangani menggunakan kunci yang dimuat di Startup.cs. Kami telah mendaftarkan instance TokenAuthOptions di Startup, jadi kami harus menyuntikkannya di konstruktor untuk TokenController:
Maka Anda harus membuat token di handler Anda untuk titik akhir login, dalam contoh saya, saya mengambil nama pengguna dan kata sandi dan memvalidasi yang menggunakan pernyataan if, tetapi hal utama yang perlu Anda lakukan adalah membuat atau memuat klaim identitas berbasis dan menghasilkan token untuk itu:
Dan seharusnya begitu. Tambahkan saja
[Authorize("Bearer")]
ke metode atau kelas apa pun yang ingin Anda lindungi, dan Anda akan mendapatkan kesalahan jika Anda mencoba mengaksesnya tanpa hadiah token. Jika Anda ingin mengembalikan 401 alih-alih kesalahan 500, Anda harus mendaftarkan penangan pengecualian kustom seperti yang saya miliki dalam contoh saya di sini .sumber
Anda dapat melihat contoh koneksi OpenId yang menggambarkan cara menangani berbagai mekanisme otentikasi, termasuk Token JWT:
https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Samples
Jika Anda melihat proyek Cordova Backend, konfigurasi untuk API adalah seperti ini:
Logika di /Providers/AuthorizationProvider.cs dan RessourceController dari proyek itu juga patut dilihat;).
Atau Anda juga dapat menggunakan kode berikut untuk memvalidasi token (ada juga cuplikan untuk membuatnya berfungsi dengan signalR):
Untuk menerbitkan token, Anda dapat menggunakan paket server OpenId Connect seperti:
EDIT: Saya telah mengimplementasikan aplikasi satu halaman dengan implementasi otentikasi berbasis token menggunakan kerangka kerja ujung depan Aurelia dan inti ASP.NET. Ada juga koneksi pers R sinyal. Namun saya belum melakukan implementasi DB. Kode dapat dilihat di sini: https://github.com/alexandre-spieser/AureliaAspNetCoreAuth
Semoga ini membantu,
Terbaik,
Alex
sumber
Lihat OpenIddict - ini adalah proyek baru (pada saat penulisan) yang membuatnya mudah untuk mengkonfigurasi pembuatan token JWT dan menyegarkan token di ASP.NET 5. Validasi token ditangani oleh perangkat lunak lain.
Dengan asumsi Anda menggunakan
Identity
denganEntity Framework
, baris terakhir adalah apa yang Anda tambahkan keConfigureServices
metode:Di
Configure
, Anda mengatur OpenIddict untuk melayani token JWT:Anda juga mengonfigurasi validasi token di
Configure
:Ada satu atau dua hal kecil lainnya, seperti DbContext Anda harus berasal dari OpenIddictContext.
Anda dapat melihat penjelasan panjang penuh di posting blog ini: http://capesean.co.za/blog/asp-net-5-jwt-tokens/
Demo yang berfungsi tersedia di: https://github.com/capesean/openiddict-test
sumber