建立自訂的路由條件約束 (C#)
Stephen Walther 示範如何建立自訂路由條件約束。 我們會實作簡單的自訂條件約束,以防止從遠端電腦提出瀏覽器要求時比對路由。
此教學課程的目標是要示範如何建立自訂路由條件約束。 自訂路由條件約束可讓您防止路由比對,除非符合某些自訂條件。
在此教學課程中,我們會建立 Localhost 路由條件約束。 Localhost 路由條件約束只符合從本機電腦提出的要求。 來自網際網路的遠端要求不相符。
您可以實作 IRouteConstraint 介面來實作自訂路由條件約束。 這是描述單一方法的非常簡單的介面,:
bool Match(
HttpContextBase httpContext,
Route route,
string parameterName,
RouteValueDictionary values,
RouteDirection routeDirection
)
方法會傳回布林值。 如果您傳回 false,與條件約束相關聯的路由不符合瀏覽器要求。
Localhost 條件約束包含在清單 1 中。
清單 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;
}
}
}
清單 1 中的條件約束會利用 HttpRequest 類別所公開的 IsLocal 屬性。 當要求的 IP 位址是 127.0.0.1 或要求 IP 位址與伺服器的 IP 位址相同時,這個屬性會傳回 true。
您可以在 Global.asax 檔案中定義的路由內使用自訂條件約束。 清單 2 中的 Global.asax 檔案會使用 Localhost 條件約束來防止任何人要求系統管理員頁面,除非他們向本機伺服器提出要求。 例如,從遠端伺服器提出 /Admin/DeleteAll 的要求失敗。
清單 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);
}
}
}
Localhost 條件約束在 Admin 路由的定義中使用。 此路由與遠端瀏覽器要求不符。 但請注意,Global.asax 中定義的其他路由可能會符合相同的要求。 請務必了解條件約束可防止特定路由比對要求,而不是 Global.asax 檔案中定義的所有路由。
請注意,Default 路由已從清單 2 中的 Global.asax 檔案加上註解。 如果您包含 Default 路由,則 Default 路由會符合 Admin 控制器的要求。 在此情況下,遠端使用者仍然可以叫用 Admin 控制器的動作,即使其要求不符合 Admin 路由也一樣。