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.Userharta 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 AuthorizeAttributedapat 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 AuthorizeAttributesecara global ke Filterskoleksi HttpConfigurationcontoh. Kod berikut snippet menunjukkan bagaimana anda boleh menambah AuthorizeAttributekepada 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 Authorize 

Di peringkat pengawal, anda boleh menyekat akses dengan menerapkan Authorizeatribut 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 Authorizeatribut 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.Userharta 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 AuthorizationFilterAttributekelas dan menggantikan OnAuthorization()kaedah. Ini adalah kaedah di mana anda boleh menulis logik kebenaran. Sekiranya kebenaran gagal, anda boleh mengembalikan contoh UnauthorizedExceptionkelas 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 AuthorizeAttributekelas 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;

        }

    }