Sdílet prostřednictvím


Vytvoření vlastního omezení trasy (C#)

Stephen Walther

Stephen Walther ukazuje, jak můžete vytvořit vlastní omezení trasy. Implementujeme jednoduché vlastní omezení, které brání spárování trasy při požadavku prohlížeče ze vzdáleného počítače.

Cílem tohoto kurzu je ukázat, jak můžete vytvořit vlastní omezení trasy. Vlastní omezení trasy umožňuje zabránit porovnávání trasy, pokud není spárována nějaká vlastní podmínka.

V tomto kurzu vytvoříme omezení trasy Localhost. Omezení trasy Localhost odpovídá pouze požadavkům provedeným z místního počítače. Vzdálené požadavky z internetu se neshodují.

Vlastní omezení trasy implementujete implementací rozhraní IRouteConstraint. Toto je velmi jednoduché rozhraní, které popisuje jednu metodu:

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

Metoda vrátí logickou hodnotu. Pokud vrátíte hodnotu false, trasa přidružená k omezení nebude odpovídat požadavku prohlížeče.

Omezení Localhost je obsaženo ve výpisu 1.

Výpis 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;
        }
    }
}

Omezení v výpisu 1 využívá isLocal vlastnost vystavené HttpRequest třídy. Tato vlastnost vrátí hodnotu true, pokud je IP adresa požadavku buď 127.0.0.1, nebo pokud je IP adresa požadavku stejná jako IP adresa serveru.

Vlastní omezení použijete v rámci trasy definované v souboru Global.asax. Soubor Global.asax ve výpisu 2 používá omezení Localhost k tomu, aby nikdo nemohl požádat o Správa stránku, pokud požadavek nepožaduje z místního serveru. Například požadavek na /Správa/DeleteAll selže, pokud je proveden ze vzdáleného serveru.

Výpis 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);
        }
    }
}

Omezení Localhost se používá v definici trasy Správa. Tato trasa nebude odpovídat požadavku vzdáleného prohlížeče. Uvědomte si však, že stejné žádosti můžou odpovídat i jiné trasy definované v souboru Global.asax. Je důležité si uvědomit, že omezení brání tomu, aby konkrétní trasa odpovídala požadavku, a ne všem trasám definovaným v souboru Global.asax.

Všimněte si, že výchozí trasa byla zakomentována ze souboru Global.asax ve výpisu 2. Pokud zahrnete výchozí trasu, bude výchozí trasa odpovídat požadavkům kontroleru Správa. V takovém případě můžou vzdálení uživatelé stále vyvolat akce kontroleru Správa, i když jejich požadavky neodpovídají Správa trase.