다음을 통해 공유


사용자 지정 경로 제약 조건 만들기(C#)

작성자 : Stephen Walther

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 제약 조건을 사용하여 로컬 서버에서 요청하지 않는 한 누구나 관리 페이지를 요청하지 못하도록 합니다. 예를 들어 원격 서버에서 수행되면 /관리/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 제약 조건은 관리 경로의 정의에 사용됩니다. 이 경로는 원격 브라우저 요청과 일치하지 않습니다. 그러나 Global.asax에 정의된 다른 경로가 동일한 요청과 일치할 수 있음을 인식합니다. 제약 조건이 특정 경로가 Global.asax 파일에 정의된 모든 경로가 아니라 요청과 일치하지 않도록 하는 것을 이해하는 것이 중요합니다.

기본 경로는 목록 2의 Global.asax 파일에서 주석 처리되었습니다. 기본 경로를 포함하는 경우 기본 경로는 관리 컨트롤러에 대한 요청과 일치합니다. 이 경우 원격 사용자는 요청이 관리 경로와 일치하지 않더라도 관리 컨트롤러의 작업을 호출할 수 있습니다.