Cara mengamankan API Web ASP.Net menggunakan penapis kebenaran
Keselamatan adalah perhatian utama dalam aplikasi perusahaan berasaskan web. Apabila anda perlu menghantar data melalui wayar, anda harus mengetahui pelbagai alat yang boleh anda gunakan untuk mengamankan data tersebut.
ASP.Net Web API adalah kerangka ringan yang digunakan untuk membina perkhidmatan RESTful tanpa status yang berjalan di HTTP. Salah satu cara untuk mendapatkan perkhidmatan API Web adalah dengan penapis kebenaran.
Sebaik-baiknya, anda harus melakukan pengesahan dan pengesahan pada peringkat awal API Web. Ini membantu menghilangkan overhead pemprosesan yang tidak perlu dari kitaran permintaan. Perhatikan bahawa, sama ada anda menggunakan modul HTTP atau pengendali mesej HTTP untuk pengesahan, anda boleh mengambil prinsipal semasa (iaitu pengguna) dari ApiController.User
harta tanah.
Ingat juga bahawa penapis kebenaran Web API dilaksanakan sebelum kaedah tindakan pengawal. Oleh itu, jika permintaan masuk tidak dibenarkan, kesalahan akan dikembalikan dari perkhidmatan, permintaan tersebut akan diabaikan, dan metode tindakan layanan tidak akan dilaksanakan.
Menggunakan penapis kebenaran AuthorizeAttribute
Penapis kebenaran terbina dalam AuthorizeAttribute
dapat digunakan untuk mengesahkan permintaan masuk. Anda boleh gunakan AuthorizeAttribute
untuk memeriksa sama ada pengguna itu disahkan. Sekiranya pengguna tidak disahkan, pengguna akan mengembalikan kod status HTTP 401. Keizinan ini boleh digunakan dalam API Web secara global atau di peringkat pengawal.
Perhatikan bahawa anda juga dapat menerapkan pengendali pesan khusus untuk mengizinkan akses ke kaedah pengawal anda kerana penapis mesej dijalankan lebih awal dalam kitaran hidup API Web.
Untuk menyekat akses ke semua pengawal, anda boleh menambahkan AuthorizeAttribute
secara global ke Filters
koleksi HttpConfiguration
contoh. Kod berikut snippet menunjukkan bagaimana anda boleh menambah AuthorizeAttribute
kepada Filters
koleksi HttpConfiguration
objek.
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: “DefaultApi”,
routeTemplate: “api/{controller}/{id}”,
defaults: new { id = RouteParameter.Optional }
);
config.Filters.Add(new AuthorizeAttribute());
}
Menggunakan atribut Authorize
Di peringkat pengawal, anda boleh menyekat akses dengan menerapkan Authorize
atribut seperti yang ditunjukkan dalam potongan kode yang diberikan seterusnya.
[Authorize]
public class EmployeesController : ApiController
{
//Write methods here that correspond to the Http verbs
}
Anda juga dapat menerapkan Authorize
atribut di tingkat tindakan untuk menyekat akses ke kaedah tindakan tertentu. Coretan kod berikut menggambarkan bagaimana ini dapat dilaksanakan.
public class EmployeesController : ApiController
{
public HttpResponseMessage Get() { //Some code }
// Require authorization for a specific action.
[Authorize]
public HttpResponseMessage Post(Employee emp) { //Some code }
}
Dalam coretan kod yang ditunjukkan sebelumnya, akses ke Post()
kaedah dibatasi sementara akses ke Get()
kaedah tidak dibatasi. Anda juga boleh menyekat pengawal dan kemudian memberikan akses tanpa nama ke satu atau lebih kaedah tindakan. Coretan kod yang berikut menggambarkan ini.
public class EmployeesController : ApiController
{
public HttpResponseMessage Get() { //Some code }
[AllowAnonymous]
public HttpResponseMessage Post(Employee emp) { //Some code }
}
Mengizinkan tindakan mengikut peranan dan pengguna
Juga mungkin untuk menyekat akses kepada kaedah tindakan oleh peranan dan pengguna. Coretan kod berikut menunjukkan bagaimana ini dapat dicapai.
[Authorize(Users="Joydip,Jini")] //Restrict access by user
public class EmployeesController : ApiController
{
//Write methods here that correspond to the Http verbs
}
Dalam contoh di atas, pengawal Pekerja mengehadkan akses kepada pengguna Joydip dan Jini sahaja. Kod di bawah menunjukkan bagaimana anda boleh menyekat akses mengikut peranan.
[Authorize(Roles="Administrators")] //Restrict by roles
public class EmployeesController : ApiController
{
//Write methods here that correspond to the Http verbs
}
Anda sentiasa boleh mengakses ApiController.User
harta tanah di dalam kaedah pengawal untuk mengambil prinsip semasa dan memberikan kebenaran berdasarkan peranan pengguna. Ini ditunjukkan dalam senarai kod di bawah.
public HttpResponseMessage Get()
{
if (User.IsInRole(“Administrators”))
{
//Write your code here
}
}
Menggunakan penapis kebenaran khas dalam ASP.Net Web API
Penapis kebenaran adalah kelas yang memperluas AuthorizationFilterAttribute
kelas dan menggantikan OnAuthorization()
kaedah. Ini adalah kaedah di mana anda boleh menulis logik kebenaran. Sekiranya kebenaran gagal, anda boleh mengembalikan contoh UnauthorizedException
kelas atau bahkan kebiasaan HttpResponseMessage
.
Penyenaraian kod berikut menunjukkan bagaimana anda dapat menerapkan kelas khusus untuk mengesahkan permintaan ke API web anda. Perhatikan bahawa anda harus melanjutkan AuthorizeAttribute
kelas untuk melaksanakan kelas penapis kebenaran anda sendiri.
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
if (AuthorizeRequest(actionContext))
{
return;
}
HandleUnauthorizedRequest(actionContext);
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//Code to handle unauthorized request
}
private bool AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//Write your code here to perform authorization
return true;
}
}