login register Sysop! about ME  
qrcode
    최초 작성일 :    2012년 07월 09일
  최종 수정일 :    2012년 07월 09일
  작성자 :    Jake
  편집자 :    Jake (류 지형)
  읽음수 :    17,500

강좌 목록으로 돌아가기

필자의 잡담~

이번 컬럼은 류지형(jake)님이 번역해 주셨으며, 이전 컬럼에 이어 사용자 정의 라우트에 제약을 적용하는 방법에 대해 설명하고 있습니다. 원문은 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs 입니다.

이 글은 Windows Azure 공식 컬럼인 http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-custom-route-constraint-cs 의 글을 편역한 내용입니다. 마이크로소프트의 공식 번역 문서가 아니며 태오 사이트 MS 컬럼 번역팀에서 번역한 내용입니다. 그렇기에, 일부 오역이나 오타가 존재할 수 있는 점 미리 양해를 구합니다. 원문에 대한 모든 저작권은 마이크로소프트에 있으며, 컬럼 내용과 관련한 질의 문답 역시 원문 사이트에 문의하시는 것을 추천드립니다.

사용자 라우트 제약조건 만들기

이번 컬럼은 간단한 사용자 라우트 제약조건을 만들어서 Admin 페이지에 대해서는 로컬 컴퓨터의 요청만을 대응하도록 하는 방법을 보여주고 있습니다.

역자 주 : 이전 글 (라우트 제약조건 만들기)과 제목이 아주 유사합니다. Custom 이라는 단어만 추가 되었는데 용어의 변화가 실제 코딩에 어떤 의미가 있는지 먼저 알려 드릴까 합니다

이전 글은 정규식을 사용하여 브라우저 요청의 일부인 매개변수를, 정확하게는 매개변수의 데이터 형식을 라우트와 매칭하는 요소로 포함시킨 반면, 이번 글에서는 IRouteConstraint 인터페이스를 구현해서 개발자가 요청의 유효성 여부를 판단하는 클래스를 직접 작성하고 있습니다. 개발자가 제약조건을 직접 클래스로 작성한다는 면에서 사용자(Custom) 라우트 제약조건이라고 특별히 표현하고 있습니다.

이번 컬럼에서는 사용자 라우트 제약조건을 만드는 방법에 대해 알아보겠습니다. 개발자는 이 제약조건을 통해 특정 라우트가 제약조건에 부합되지 않는 경우 요청에 대응하지 않도록 할 수 있습니다.

그런 의미에서 이번 컬럼에서는 Localhost 라고 하는 라우트 제약조건을 만들어 보겠습니다. 이 제약조건은 로컬 컴퓨터로부터 오는 요청에 대해서만 대응할 것입니다.

사용자 라우트 제약조건을 작성하기 위해서IRouteConstraint 인터페이스를 구현해야 하는데 이 인터페이스는 하나의 메서드만을 가지는 아주 간단한 인터페이스입니다.

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

이 메서드는 Boolean 값을 반환하며 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 속성을 사용하여 아주 쉽게 Match 메서드를 구현했습니다. IsLocal 속성은 요청에 사용된 IP가 127.0.0.1 이거나 웹서버의 IP와 같은 경우에만 true로 설정되어 로컬 요청을 확인하는데 편리함을 제공하고 있습니다.

Global.asax 파일에 정의된 라우트와 함께 방금 작성한 사용자 라우트 제약조건을 사용해 보겠습니다. 목록 2의 Localhost 제약조건은 로컬 요청이 아니라면 어떤 요청도 Admin 페이지에 접근할 수 없도록 합니다. 예를 들어, /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 라우트를 정의할 때 사용됩니다. 이 Admin 라우트는 어떤 외부 요청에도 대응하지 않습니다. 그러나 Global.asax에 정의된 다른 라우트가 외부 Admin 페이지 요청에 대응할 수도 있다는 점을 인지하고 있어야겠습니다. 이런 제약조건은 특정 라우트가 어떤 요청에 대응할 수 없도록 방지하는 것이지, 모든 라우트에 적용되는 것이 아니라는 것을 이해하는 것이 중요합니다.

이미 알아채셨겠지만 목록 2의 Global.asax에서 Default 라우트는 주석 처리되어 있습니다. 이것이 코드의 일부로 포함되어 있다면 Default 라우트가 대응하여 Admin 컨트롤러에 대한 요청들을 처리할 겁니다. 이런 경우라면, Admin 컨트롤러에 대한 요청은 비록 Admin 라우트와는 매칭되지 않지만 Default 라우트가 대응하여 외부 요청이라 할지라도 Admin 컨트롤러에 정의된 액션이 실행될 수 있습니다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})