Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
von Stephen Walther
Stephen Walther veranschaulicht, wie Sie eine benutzerdefinierte Routeneinschränkung erstellen können. Wir implementieren eine einfache benutzerdefinierte Einschränkung, die verhindert, dass eine Route abgeglichen wird, wenn eine Browseranforderung von einem Remotecomputer erfolgt.
Das Ziel dieses Tutorials besteht darin, zu veranschaulichen, wie Sie eine benutzerdefinierte Routeneinschränkung erstellen können. Mit einer benutzerdefinierten Routeneinschränkung können Sie verhindern, dass eine Route abgeglichen wird, es sei denn, eine benutzerdefinierte Bedingung wurde erfüllt.
In diesem Tutorial erstellen wir eine Localhost-Routeneinschränkung. Die Localhost-Routeneinschränkung entspricht nur Anforderungen, die vom lokalen Computer gesendet werden. Remoteanforderungen aus dem Internet werden nicht abgeglichen.
Sie implementieren eine benutzerdefinierte Routeneinschränkung, indem Sie die IRouteConstraint-Schnittstelle implementieren. Dies ist eine extrem einfache Schnittstelle, die eine einzelne Methode beschreibt:
bool Match(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
Die -Methode gibt einen booleschen Wert zurück. Wenn Sie false zurückgeben, stimmt die der Einschränkung zugeordnete Route nicht mit der Browseranforderung überein.
Die Localhost-Einschränkung ist in Listing 1 enthalten.
Eintrag 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;
}
}
}
Die Einschränkung in Listing 1 nutzt die IsLocal-Eigenschaft, die von der HttpRequest-Klasse verfügbar gemacht wird. Diese Eigenschaft gibt true zurück, wenn die IP-Adresse der Anforderung entweder 127.0.0.1 lautet oder wenn die IP-Adresse der Anforderung mit der IP-Adresse des Servers identisch ist.
Sie verwenden eine benutzerdefinierte Einschränkung innerhalb einer Route, die in der Datei Global.asax definiert ist. Die Datei Global.asax in Listing 2 verwendet die Localhost-Einschränkung, um zu verhindern, dass jemand eine Admin Seite anfordert, es sei denn, er stellt die Anforderung vom lokalen Server. Beispielsweise schlägt eine Anforderung für /Admin/DeleteAll fehl, wenn sie von einem Remoteserver ausgeführt wird.
Auflistung 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);
}
}
}
Die Localhost-Einschränkung wird in der Definition der Admin Route verwendet. Diese Route wird nicht durch eine Remotebrowseranforderung abgeglichen. Beachten Sie jedoch, dass andere routen, die in Global.asax definiert sind, der gleichen Anforderung entsprechen können. Es ist wichtig zu verstehen, dass eine Einschränkung verhindert, dass eine bestimmte Route mit einer Anforderung übereinstimmt und nicht alle Routen, die in der Datei Global.asax definiert sind.
Beachten Sie, dass die Standardroute aus der Datei Global.asax in Listing 2 auskommentiert wurde. Wenn Sie die Standardroute einschließen, entspricht die Standardroute den Anforderungen für den Admin-Controller. In diesem Fall könnten Remotebenutzer weiterhin Aktionen des Admin-Controllers aufrufen, obwohl ihre Anforderungen nicht mit der Admin Route übereinstimmen würden.