Saya kagum bagaimana saya tidak dapat menemukan contoh yang jelas tentang bagaimana mengotentikasi pengguna langsung dari layar masuk ke menggunakan atribut Otorisasi atas metode ApiController saya setelah beberapa jam Googling.
Itu karena Anda bingung tentang dua konsep ini:
Otentikasi adalah mekanisme di mana sistem dapat mengidentifikasi penggunanya dengan aman. Sistem otentikasi memberikan jawaban atas pertanyaan:
- Siapa pengguna itu?
- Apakah pengguna benar-benar mewakili dirinya?
Otorisasi adalah mekanisme di mana sistem menentukan tingkat akses yang harus dimiliki pengguna terotentikasi tertentu untuk mendapatkan sumber daya yang dikendalikan oleh sistem. Sebagai contoh, sistem manajemen basis data mungkin dirancang untuk memberikan individu tertentu dengan kemampuan untuk mengambil informasi dari database tetapi tidak kemampuan untuk mengubah data yang disimpan dalam basis data, sementara memberi individu lain kemampuan untuk mengubah data. Sistem otorisasi memberikan jawaban atas pertanyaan:
- Apakah pengguna X diizinkan untuk mengakses sumber daya R?
- Apakah pengguna X diizinkan untuk melakukan operasi P?
- Apakah pengguna X diizinkan untuk melakukan operasi P pada sumber daya R?
The Authorize
atribut dalam MVC digunakan untuk menerapkan aturan akses, misalnya:
[System.Web.Http.Authorize(Roles = "Admin, Super User")]
public ActionResult AdministratorsOnly()
{
return View();
}
Aturan di atas hanya akan memungkinkan pengguna dalam peran Admin dan Pengguna Super untuk mengakses metode ini
Aturan-aturan ini juga dapat diatur di file web.config, menggunakan location
elemen. Contoh:
<location path="Home/AdministratorsOnly">
<system.web>
<authorization>
<allow roles="Administrators"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
Namun, sebelum aturan otorisasi tersebut dijalankan, Anda harus disahkan ke situs web saat ini .
Meskipun ini menjelaskan cara menangani permintaan yang tidak sah, ini tidak menunjukkan dengan jelas sesuatu seperti LoginController atau sesuatu seperti itu untuk meminta kredensial pengguna dan memvalidasinya.
Dari sini, kami dapat membagi masalah menjadi dua:
Otentikasi pengguna saat mengonsumsi layanan API Web dalam aplikasi Web yang sama
Ini akan menjadi pendekatan yang paling sederhana, karena Anda akan mengandalkan Otentikasi di ASP.Net
Ini adalah contoh sederhana:
Web.config
<authentication mode="Forms">
<forms
protection="All"
slidingExpiration="true"
loginUrl="account/login"
cookieless="UseCookies"
enableCrossAppRedirects="false"
name="cookieName"
/>
</authentication>
Pengguna akan diarahkan ke rute akun / login , di sana Anda akan membuat kontrol khusus untuk meminta kredensial pengguna dan kemudian Anda akan mengatur cookie otentikasi menggunakan:
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
Otentikasi lintas platform
Kasus ini akan terjadi ketika Anda hanya mengekspos layanan API Web dalam aplikasi Web karena itu, Anda akan memiliki klien lain yang mengkonsumsi layanan tersebut, klien dapat berupa aplikasi Web lain atau aplikasi .Net (Formulir Win, WPF, konsol, layanan Windows, dll)
Sebagai contoh, asumsikan bahwa Anda akan menggunakan layanan Web API dari aplikasi web lain pada domain jaringan yang sama (dalam intranet), dalam hal ini Anda bisa mengandalkan otentikasi Windows yang disediakan oleh ASP.Net.
<authentication mode="Windows" />
Jika layanan Anda terpapar di Internet, maka Anda harus memberikan token yang diautentikasi ke setiap layanan Web API.
Untuk info lebih lanjut, ambil rampasan ke artikel berikut: