Cara mengamankan API Web ASP.Net menggunakan filter otorisasi

Keamanan merupakan perhatian utama dalam aplikasi perusahaan berbasis web. Saat Anda perlu mengirimkan data melalui kabel, Anda harus mengetahui berbagai alat yang dapat Anda gunakan untuk mengamankan data tersebut.

ASP.Net Web API adalah kerangka kerja ringan yang digunakan untuk membangun layanan RESTful stateless yang berjalan di HTTP. Salah satu cara untuk mengamankan layanan API Web adalah dengan filter otorisasi.

Idealnya, Anda harus melakukan otentikasi dan otorisasi lebih awal di pipeline API Web. Ini membantu menghilangkan overhead pemrosesan yang tidak perlu dari siklus permintaan. Perhatikan bahwa, apakah Anda menggunakan modul HTTP atau penangan pesan HTTP untuk otentikasi, Anda dapat mengambil prinsipal saat ini (yaitu pengguna) dari ApiController.Userproperti.

Juga perlu diingat bahwa filter otorisasi API Web dijalankan sebelum metode tindakan pengontrol. Jadi jika permintaan yang masuk tidak diotorisasi, kesalahan akan dikembalikan dari layanan, permintaan akan diabaikan, dan metode tindakan layanan tidak akan dijalankan.

Menggunakan filter otorisasi AuthorizeAttribute

Filter otorisasi bawaan AuthorizeAttributedapat digunakan untuk mengotorisasi permintaan yang masuk. Anda dapat menggunakan  AuthorizeAttribute untuk memeriksa apakah pengguna diautentikasi. Jika pengguna tidak diautentikasi, ia akan mengembalikan kode status HTTP 401. Otorisasi ini dapat diterapkan di API Web secara global atau di tingkat pengontrol.

Perhatikan bahwa Anda juga dapat menerapkan penangan pesan khusus untuk memberi otorisasi akses ke metode pengontrol Anda karena filter pesan dijalankan jauh lebih awal dalam siklus hidup API Web.

Untuk membatasi akses ke semua pengontrol, Anda dapat menambahkan AuthorizeAttributesecara global ke Filterskoleksi HttpConfigurationinstance. Cuplikan kode berikut menunjukkan bagaimana Anda dapat menambahkan AuthorizeAttributeke Filterskoleksi HttpConfigurationobjek.

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 Otorisasi 

Di tingkat pengontrol, Anda dapat membatasi akses dengan menerapkan Authorizeatribut seperti yang ditunjukkan dalam cuplikan kode yang diberikan berikutnya.

[Authorize]

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Anda juga dapat menerapkan Authorizeatribut di tingkat tindakan untuk membatasi akses ke metode tindakan tertentu. Cuplikan kode berikut menggambarkan bagaimana ini dapat diterapkan.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

   // Require authorization for a specific action.

    [Authorize]

    public HttpResponseMessage Post(Employee emp) { //Some code }

Dalam potongan kode yang ditunjukkan sebelumnya, akses ke Post()metode dibatasi sementara akses ke Get()metode tidak dibatasi. Anda juga dapat membatasi pengontrol dan kemudian memberikan akses anonim ke satu atau beberapa metode tindakan. Potongan kode berikut menggambarkan hal ini.

public class EmployeesController : ApiController

{

    public HttpResponseMessage Get() { //Some code }

    [AllowAnonymous]

    public HttpResponseMessage Post(Employee emp) { //Some code }

}

Beri otorisasi tindakan menurut peran dan pengguna

Dimungkinkan juga untuk membatasi akses ke metode tindakan berdasarkan peran dan pengguna. Potongan kode 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, pengontrol Karyawan membatasi akses hanya ke pengguna Joydip dan Jini. Kode di bawah menunjukkan bagaimana Anda dapat membatasi akses berdasarkan peran.

[Authorize(Roles="Administrators")] //Restrict by roles

public class EmployeesController : ApiController

{

    //Write methods here that correspond to the Http verbs

}

Anda selalu dapat mengakses ApiController.Userproperti di dalam metode pengontrol untuk mengambil prinsip saat ini dan memberikan otorisasi berdasarkan peran pengguna. Ini ditunjukkan dalam daftar kode di bawah ini.

public HttpResponseMessage Get()

{

    if (User.IsInRole(“Administrators”))

    {

        //Write your code here

    }

}

Menggunakan filter otorisasi kustom di ASP.Net Web API

Filter otorisasi adalah kelas yang memperluas AuthorizationFilterAttributekelas dan mengganti OnAuthorization()metode. Ini adalah metode di mana Anda dapat menulis logika otorisasi. Jika otorisasi gagal, Anda dapat mengembalikan instance UnauthorizedExceptionkelas atau bahkan kustom HttpResponseMessage.

Daftar kode berikut menunjukkan bagaimana Anda dapat menerapkan kelas khusus untuk memberi otorisasi permintaan ke API web Anda. Perhatikan bahwa Anda harus memperluas AuthorizeAttributekelas untuk menerapkan kelas filter otorisasi 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;

        }

    }