Implementasi Otentikasi Skema Dasar gaya Microsoft yang mudah digunakan dan sangat ringan untuk ASP.NET Core.
Lihat Di GitHub
.NET Framework 4.6.1 dan/atau NetStandard 2.0 dan seterusnya
Multi-target: net8.0; net7.0; bersih6.0; net5.0; netcoreapp3.1; netcoreapp3.0; standar bersih2.0; net461
Perpustakaan ini diterbitkan di NuGet. Jadi paket NuGet dapat diinstal langsung ke proyek Anda jika Anda ingin menggunakannya tanpa membuat perubahan khusus apa pun pada kodenya.
Unduh langsung dari tautan di bawah ini. Harap pertimbangkan untuk mengunduh paket baru karena paket lama sudah usang.
Tautan Paket Baru - AspNetCore.Authentication.Basic.
Tautan Paket Lama - Mihir.AspNetCore.Authentication.Basic.
Atau dengan menjalankan perintah di bawah ini pada proyek Anda.
PM> Install-Package AspNetCore.Authentication.Basic
Sampel tersedia di direktori sampel.
Menyiapkannya cukup sederhana. Anda memerlukan pengetahuan dasar tentang ASP.NET Core 2.0 atau yang lebih baru untuk mulai menggunakan perpustakaan ini.
Ada 2 cara berbeda dalam menggunakan perpustakaan ini untuk melakukan tugasnya. Kedua cara tersebut dapat dicampur jika diperlukan.
1] Menggunakan implementasi IBasicUserValidationService
2] Menggunakan BasicOptions.Events (delegasi OnValidateCredentials) yang merupakan pendekatan yang sama yang akan Anda temukan di perpustakaan otentikasi Microsoft
Catatan:
Ini mengharuskan Realm diatur dalam opsi jika SuppressWWWAuthenticateHeader tidak diatur.
Jika implementasi antarmuka IBasicUserValidationService digunakan serta delegasi BasicOptions.Events.OnValidateCredentials juga disetel, maka delegasi ini akan digunakan terlebih dahulu.
Selalu gunakan protokol HTTPS (Sertifikat SSL) dalam produksi saat menggunakan otentikasi dasar.
menggunakan AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// Diperlukan Realm untuk disetel dalam opsi jika SuppressWWWAuthenticateHeader tidak disetel.// Jika implementasi antarmuka IBasicUserValidationService digunakan serta opsi Delegasi .Events.OnValidateCredentials juga disetel maka delegasi ini akan digunakan first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// AddBasic di bawah ini tanpa parameter tipe akan memerlukan options.Events.OnValidateCredentials delegete untuk disetel.//.AddBasic(options => { options.Realm = "Aplikasi Saya"; }) ;// Parameter AddBasic with type di bawah ini akan menambahkan BasicUserValidationService ke container ketergantungan. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddControllers();//// Secara default, autentikasi tidak ditantang untuk setiap permintaan yang merupakan default ASP.NET Core yang dimaksudkan behavior.//// Jadi untuk menantang autentikasi untuk setiap permintaan, harap gunakan opsi FallbackPolicy di bawah ini.//services.AddAuthorization(options =>//{// options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();//});}public void Configure(IApplicationBuilder app, IHostingEnvironment env){app.UseHttpsRedirection();// Urutan rantai pipeline di bawah ini adalah penting!app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}}
menggunakan AspNetCore.Authentication.Basic;public class Startup{public void ConfigureServices(IServiceCollection services){// Diperlukan Realm untuk disetel dalam opsi jika SuppressWWWAuthenticateHeader tidak disetel.// Jika implementasi antarmuka IBasicUserValidationService digunakan serta opsi Delegasi .Events.OnValidateCredentials juga disetel maka delegasi ini akan digunakan first.services.AddAuthentication(BasicDefaults.AuthenticationScheme)// AddBasic di bawah ini tanpa parameter tipe akan memerlukan options.Events.OnValidateCredentials delegete untuk disetel.//.AddBasic(options => { options.Realm = "Aplikasi Saya"; }) ;// Parameter AddBasic with type di bawah ini akan menambahkan BasicUserValidationService ke wadah ketergantungan. .AddBasic<BasicUserValidationService>(options => { options.Realm = "My App"; });services.AddMvc();//// Secara default, autentikasi tidak ditantang untuk setiap permintaan yang merupakan default ASP.NET Core yang dimaksudkan behavior.//// Jadi untuk menantang otentikasi untuk setiap permintaan, silakan gunakan opsi di bawah ini daripada di atas services.AddMvc().//services.AddMvc(options => //{// options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));//});}public void Configure(aplikasi IApplicationBuilder, IHostingEnvironment env){app.UseAuthentication( );aplikasi.UseMvc();}}
menggunakan AspNetCore.Authentication.Basic; kelas publik BasicUserValidationService : IBasicUserValidationService{private readonly ILogger<BasicUserValidationService> _logger;private readonly IUserRepository _userRepository;public BasicUserValidationService(ILogger<BasicUserValidationService> logger, IUserRepository userRepository){_logger = logger;_userRepository = userRepository;}Tugas async publik<bool> IsValidAsync(string nama pengguna, kata sandi string){coba{// CATATAN: JANGAN GUNAKAN IMPLEMENTASI INI. INI HANYA UNTUK TUJUAN DEMO // Tulis implementasi Anda di sini dan kembalikan benar atau salah tergantung pada validasinya..var user = menunggu _userRepository.GetUserByUsername(username);var isValid = user != null && user.Password == password;return isValid;}catch (Pengecualian e){_logger.LogError(e, e.Message);throw;}}}
Wajib disetel jika SuppressWWWAuthenticateHeader tidak disetel ke true. Ini digunakan dengan header respons WWW-Authenticate ketika menantang permintaan yang tidak diautentikasi.
Nilai defaultnya salah.
Jika disetel ke true, ini TIDAK akan mengembalikan header respons WWW-Authenticate ketika menantang permintaan yang tidak diautentikasi.
Jika disetel ke false, header respons WWW-Authenticate akan dikembalikan ketika menantang permintaan yang tidak diautentikasi.
Nilai defaultnya salah.
Jika disetel ke benar, ia akan memeriksa apakah filter AllowAnonymous pada tindakan pengontrol atau metadata pada titik akhir yang, jika ditemukan, tidak mencoba mengautentikasi permintaan.
Objek yang disediakan oleh aplikasi untuk memproses peristiwa yang dimunculkan oleh middleware otentikasi dasar.
Aplikasi dapat mengimplementasikan antarmuka sepenuhnya, atau dapat membuat instance BasicEvents dan menugaskan delegasi hanya pada kejadian yang ingin diproses.
Delegasi yang ditugaskan ke properti ini akan dipanggil sebelum memvalidasi kredensial.
Anda harus memberikan delegasi untuk properti ini agar autentikasi dapat dilakukan.
Dalam delegasi Anda, Anda harus memanggil konteks.ValidationSucceeded() yang akan menangani pembuatan prinsip klaim autentikasi dari detail pengguna yang akan menetapkan properti konteks.Prinsipal dan memanggil konteks.Success(), atau membuat prinsip klaim autentikasi dari pengguna detailnya dan tetapkan ke properti konteks.Principal dan terakhir panggil metode konteks.Success().
Jika hanya properti konteks.Prinsipal yang disetel tanpa memanggil metode konteks.Success(), maka metode Sukses() akan otomatis dipanggil.
Delegasi yang ditugaskan ke properti ini akan dipanggil ketika autentikasi berhasil. Itu tidak akan dipanggil jika delegasi OnValidateCredentials ditugaskan.
Ini dapat digunakan untuk menambahkan klaim, header, dll ke respons.
Delegasi yang ditugaskan ke properti ini akan dipanggil ketika pengecualian tak terduga muncul di dalam perpustakaan.
Delegasi yang ditugaskan ke properti ini akan dipanggil sebelum tantangan dikirim kembali ke pemanggil saat menangani respons yang tidak sah.
Hanya gunakan ini jika Anda tahu apa yang Anda lakukan dan jika Anda ingin menggunakan penerapan khusus. Atur delegasi untuk menangani masalah tantangan 401, jika skema autentikasi yang dimaksud menangani interaksi autentikasi sebagai bagian dari alur permintaannya. (seperti menambahkan header respons, atau mengubah hasil 401 menjadi 302 pada halaman login atau lokasi masuk eksternal.)
Panggil konteks.Handled() di bagian akhir sehingga logika default apa pun untuk tantangan ini akan dilewati.
Delegasi yang ditugaskan pada properti ini akan dipanggil jika Otorisasi gagal dan menghasilkan respons Terlarang.
Hanya gunakan ini jika Anda tahu apa yang Anda lakukan dan jika Anda ingin menggunakan penerapan khusus.
Atur delegasi untuk menangani Larangan.
Panggil konteks.Handled() di akhir sehingga logika default apa pun akan dilewati.
Dengan ASP.NET Core, semua permintaan tidak ditantang untuk otentikasi secara default. Jadi jangan khawatir jika BasicUserValidationService Anda tidak tercapai saat Anda tidak meneruskan detail autentikasi dasar yang diperlukan dengan permintaan tersebut. Itu adalah perilaku normal. ASP.NET Core menantang otentikasi hanya ketika secara khusus diperintahkan untuk melakukannya baik dengan mendekorasi pengontrol/metode dengan atribut filter [Otorisasi] atau dengan cara lain.
Namun, jika Anda ingin semua permintaan menantang autentikasi secara default, bergantung pada apa yang Anda gunakan, Anda dapat menambahkan baris opsi di bawah ini ke metode ConfigureServices pada kelas Startup .
// Pada ASP.NET Core 3.0 dan seterusnyaservices.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();});// OR// Pada ASP.NET Core 2.0 dan seterusnyaservices.AddMvc (pilihan => {options.Filters.Add(new AuthorizeFilter(new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build()));});
Jika Anda tidak menggunakan MVC tetapi menggunakan Endpoint di ASP.NET Core 3.0 atau yang lebih baru, Anda dapat menambahkan metode rantai .RequireAuthorization()
ke peta titik akhir di bawah Konfigurasikan metode pada kelas Startup seperti yang ditunjukkan di bawah ini.
// ASP.NET Core 3.0 dan seterusnyaapp.UseEndpoints(endpoints =>{endpoints.MapGet("/", konteks async =>{menunggu konteks.Response.WriteAsync("Halo Dunia!");}).RequireAuthorization(); / / PERHATIKAN INI DI SINI!!!! });
ASP.NET Core mendukung penambahan beberapa skema otentikasi yang juga didukung perpustakaan ini. Hanya perlu menggunakan metode ekstensi yang menggunakan nama skema sebagai parameter. Sisanya semuanya sama. Hal ini dapat dicapai dengan berbagai cara. Di bawah ini hanyalah contoh kasar singkatnya.
Harap dicatat bahwa parameter nama skema dapat berupa string apa pun yang Anda inginkan.
public void ConfigureServices(layanan IServiceCollection){services.AddTransient<IUserRepository, InMemoryUserRepository>();services.AddAuthentication("Scheme1").AddBasic<BasicUserValidationService>("Scheme1", options => { options.Realm = "Aplikasi Saya"; }).AddBasic<BasicUserValidationService_2>("Scheme2", options => { options.Realm = "Aplikasi Saya"; }).AddBasic("Scheme3", options => { options.Realm = "Aplikasi Saya"; options.Events = new BasicEvents{OnValidateCredentials = async (konteks) =>{var userRepository = konteks.HttpContext.RequestServices.GetRequiredService<IUserRepository>();var user = menunggu userRepository.GetUserByUsername(context.Username);var isValid = pengguna ! = null && pengguna.Kata Sandi == konteks.Kata Sandi;jika (isValid){context.Response.Headers.Add("ValidationCustomHeader", "Dari OnValidateCredentials");var klaim = new[]{new Claim("CustomClaimType", "Nilai Klaim Khusus - dari OnValidateCredentials")};context.ValidationSucceeded (klaim); // klaim bersifat opsional}else{context.ValidationFailed();}}}});services.AddControllers();services.AddAuthorization(options =>{options.FallbackPolicy = new AuthorizationPolicyBuilder("Scheme1", "Scheme2", " Skema3").RequireAuthenticatedUser().Build();});}
Versi | Catatan |
---|---|
8.0.0 |
|
7.0.0 |
|
6.0.1 |
|
5.1.0 |
|
5.0.0 |
|
3.1.1 |
|
3.1.0 |
|
2.2.0 |
|
RFC 7617: Spesifikasi teknis untuk HTTP Basic
Dokumentasi Keamanan Inti ASP.NET
aspnet/Keamanan
Lisensi MIT