Tworzenie niestandardowego ograniczenia trasy (C#)

Autor: Stephen Walther

Stephen Walther pokazuje, jak można utworzyć ograniczenie trasy niestandardowej. Implementujemy proste ograniczenie niestandardowe, które uniemożliwia dopasowanie trasy po wysłaniu żądania przeglądarki z komputera zdalnego.

Celem tego samouczka jest zademonstrowanie sposobu tworzenia niestandardowego ograniczenia trasy. Ograniczenie trasy niestandardowej umożliwia zapobieganie dopasowywaniu trasy, chyba że zostanie dopasowany jakiś warunek niestandardowy.

W tym samouczku utworzymy ograniczenie trasy localhost. Ograniczenie trasy localhost odpowiada tylko żądaniom wysyłanym z komputera lokalnego. Żądania zdalne z Internetu nie są dopasowywane.

Ograniczenie trasy niestandardowej jest implementowane przez zaimplementowanie interfejsu IRouteConstraint. Jest to niezwykle prosty interfejs, który opisuje jedną metodę:

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

Metoda zwraca wartość logiczną. Jeśli zwrócisz wartość false, trasa skojarzona z ograniczeniem nie będzie zgodna z żądaniem przeglądarki.

Ograniczenie Localhost znajduje się na liście 1.

Lista 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;
        }
    }
}

Ograniczenie w liście 1 korzysta z właściwości IsLocal uwidocznionej przez klasę HttpRequest. Ta właściwość zwraca wartość true, gdy adres IP żądania to 127.0.0.1 lub gdy adres IP żądania jest taki sam jak adres IP serwera.

Niestandardowe ograniczenie jest używane w ramach trasy zdefiniowanej w pliku Global.asax. Plik Global.asax na liście 2 używa ograniczenia Localhost, aby uniemożliwić każdemu zażądanie strony Administracja, chyba że wysyłają żądanie z serwera lokalnego. Na przykład żądanie /Administracja/DeleteAll zakończy się niepowodzeniem po wysłaniu z serwera zdalnego.

Lista 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);
        }
    }
}

Ograniczenie Localhost jest używane w definicji trasy Administracja. Ta trasa nie zostanie dopasowana przez zdalne żądanie przeglądarki. Należy jednak pamiętać, że inne trasy zdefiniowane w pliku Global.asax mogą być zgodne z tym samym żądaniem. Należy pamiętać, że ograniczenie uniemożliwia dopasowanie określonej trasy do żądania, a nie wszystkie trasy zdefiniowane w pliku Global.asax.

Zwróć uwagę, że trasa domyślna została oznaczona jako komentarz z pliku Global.asax na liście 2. Jeśli dołączysz trasę domyślną, trasa domyślna będzie zgodna z żądaniami kontrolera Administracja. W takim przypadku użytkownicy zdalni nadal mogą wywoływać akcje kontrolera Administracja, mimo że ich żądania nie pasują do trasy Administracja.