Bagikan melalui


Membuat Batasan Rute Kustom (C#)

oleh Stephen Walther

Stephen Walther menunjukkan bagaimana Anda dapat membuat batasan rute kustom. Kami menerapkan batasan kustom sederhana yang mencegah rute dicocokkan ketika permintaan browser dibuat dari komputer jarak jauh.

Tujuan tutorial ini adalah untuk menunjukkan bagaimana Anda dapat membuat batasan rute kustom. Batasan rute kustom memungkinkan Anda mencegah rute dicocokkan kecuali beberapa kondisi kustom cocok.

Dalam tutorial ini, kami membuat batasan rute Localhost. Batasan rute Localhost hanya cocok dengan permintaan yang dibuat dari komputer lokal. Permintaan jarak jauh dari seluruh Internet tidak cocok.

Anda menerapkan batasan rute kustom dengan mengimplementasikan antarmuka IRouteConstraint. Ini adalah antarmuka yang sangat sederhana yang menjelaskan satu metode:

bool Match(
    HttpContextBase httpContext,
    Route route,
    string parameterName,
    RouteValueDictionary values,
    RouteDirection routeDirection
)

Metode mengembalikan nilai Boolean. Jika Anda mengembalikan false, rute yang terkait dengan batasan tidak akan cocok dengan permintaan browser.

Batasan Localhost terkandung dalam Daftar 1.

Daftar 1 - LocalhostConstraint.cs

using System.Web;
using System.Web.Routing;
namespace MvcApplication1.Constraints
{
    public class LocalhostConstraint : IRouteConstraint
    {
        public bool Match
            (
                HttpContextBase httpContext, 
                Route route, 
                string parameterName, 
                RouteValueDictionary values, 
                RouteDirection routeDirection
            )
        {
            return httpContext.Request.IsLocal;
        }
    }
}

Batasan dalam Daftar 1 memanfaatkan properti IsLocal yang diekspos oleh kelas HttpRequest. Properti ini mengembalikan true ketika alamat IP permintaan adalah 127.0.0.1 atau ketika IP permintaan sama dengan alamat IP server.

Anda menggunakan batasan kustom dalam rute yang ditentukan dalam file Global.asax. File Global.asax di Listing 2 menggunakan batasan Localhost untuk mencegah siapa pun meminta halaman Admin kecuali mereka membuat permintaan dari server lokal. Misalnya, permintaan untuk /Admin/DeleteAll akan gagal saat dibuat dari server jarak jauh.

Daftar 2 - Global.asax

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication1.Constraints;
namespace MvcApplication1
{
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Admin",
                "Admin/{action}",
                new {controller="Admin"},
                new {isLocal=new LocalhostConstraint()}
            );
            //routes.MapRoute(
            //    "Default",                                              // Route name
            //    "{controller}/{action}/{id}",                           // URL with parameters
            //    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
            //);
        }
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Batasan Localhost digunakan dalam definisi rute Admin. Rute ini tidak akan dicocokkan dengan permintaan browser jarak jauh. Namun, sadarilah bahwa rute lain yang ditentukan di Global.asax mungkin cocok dengan permintaan yang sama. Penting untuk dipahami bahwa batasan mencegah rute tertentu cocok dengan permintaan dan tidak semua rute yang ditentukan dalam file Global.asax.

Perhatikan bahwa rute Default telah dikomentari dari file Global.asax di Daftar 2. Jika Anda menyertakan rute Default, maka rute Default akan cocok dengan permintaan untuk pengontrol Admin. Dalam hal ini, pengguna jarak jauh masih dapat memanggil tindakan pengontrol Admin meskipun permintaan mereka tidak akan cocok dengan rute Admin.