2013-08-27 12 views
4

자체 호스팅 웹 API 프로젝트가 있으므로 Yao's blog post을 사용하여 도움말 페이지 작업을 수행해야했습니다. 다음으로, 무단 사용으로부터 제 방법 중 일부를 보호해야합니다. this idea을 구현했습니다.웹 API 라우팅 문제

이제 재미있는 부분입니다. 나는 3 개 경로를 가지고 :

페이지 도움말에 이르게

/help,

/authentication/authenticate

는 인증 방법을 호출하는 데 사용됩니다 그것은 사용자 자격 증명을 기대하고이 경로가 필요

/transaction/{action}/{id} 성공의 경우 보안 토큰을 반환 무단 사용으로부터 보호해야한다.

기본적으로 컨트롤러 = 트랜잭션 인 모든 경로를 TokenInspector으로 처리해야합니다.

1. 시나리오 :이 같은 라우팅 구성이있는 경우 :

_config.Routes.MapHttpRoute(
      name: "AuthenticatedOnly", 
      routeTemplate: "transaction/{action}/{id}", 
      defaults: new {controller = "Transaction", action="GetNewTaskId", id=RouteParameter.Optional}, 
      constraints: null, 
      handler: tokenInspector 
      ); 

     _config.Routes.MapHttpRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      defaults: new { controller="Help", action="Index", id = RouteParameter.Optional} 
      ); 

모두가 도움말 페이지를 제외하고 잘 작동에만 POST Authentication/Authenticate 항목을 보여줍니다

2. 시나리오 : 내가 변경하는 경우 라우팅 구성 :

_config.Routes.MapHttpRoute(
      name: "AuthenticatedOnly", 
      routeTemplate: "transaction/{action}/{id}", 
      defaults: new {}, 
      constraints: null, 
      handler: tokenInspector 
      ); 

     _config.Routes.MapHttpRoute(
      "Default", 
      "{controller}/{action}/{id}", 
      defaults: new { controller="Help", action="Index", id = RouteParameter.Optional} 
      ); 

도움말 페이지가 제대로 작동하고 모든 방법이 표시되지만 /transaction은 더 이상 보안이 설정되지 않고 토큰없이 작동합니다.

3. 시나리오 :

_config.Routes.MapHttpRoute(
       name: "AuthenticatedOnly", 
       routeTemplate: "transaction/{action}/{id}", 
       defaults: new {id=RouteParameter.Optional}, 
       constraints: null, 
       handler: tokenInspector 
       ); 

      _config.Routes.MapHttpRoute(
       "Default", 
       "{controller}/{action}/{id}", 
       defaults: new { controller="Help", action="Index", id = RouteParameter.Optional} 
       ); 

작품 모두 인증 및 도움말 페이지하지만 헤더의 내가 유효한 토큰과 /Transaction/GetNewTaskId 같은 요청을 할 때, 나는 수 (404)

업데이트 누구라도 설명 할 수 있습니까? 어떻게 도움말 페이지 생성이 등록 된 경로에 의존합니까? 그것을 조정할 수있는 방법이 있습니까 컨트롤러 콘센트 물건을 인쇄하는 ApiExplorer을 시행 할 수 있습니까? 문서를 유지할뿐만 아니라 보안 패턴 -

업데이트 좀 더 투쟁 후 2 및 조사, 나는 내 목표를 일치하는 솔루션을 발견했다. 사용자 지정 메시지 처리기를 구현했습니다 (기본적으로 TokenInspector를 사용했지만 URL 필터링을 논리에 추가했습니다).

_config.Routes.MapHttpRoute(
       name: "Default", 
       routeTemplate: "{controller}/{action}/{id}", 
       defaults: new { controller = "Help", action = "Index", id=RouteParameter.Optional } 
       ); 

를이 내가 서버 실행 방법은 다음과 같습니다 : 그래서

, 지금은 하나의 경로가

_config = new ExtendedHttpSelfHostConfiguration(ServiceAddress); 
      TokenInspector tokenInspector = new TokenInspector() { InnerHandler = new HttpRoutingDispatcher(_config) }; 
      _server = new HttpSelfHostServer(_config, tokenInspector); 
      ConfigureHost(_config); 
      _server.OpenAsync(); 

아마, 그것이 같은 문제는, 이런 식으로 대답 할 수없는을 , 어쨌든, 당신의 노력에 감사드립니다!

답변

1
//This is for your public controllers 
//this route will ONLY catch requests for Help and Authentication controllers only 
//you will need to include any new public controller that uses the route pattern 
_config.Routes.MapHttpRoute(
    name: "Public", 
    routeTemplate: "{controller}/{action}/{id}", 
    constraints: new { controller = @"^(Help|Authentication)$" }, 
    defaults: new { controller="Help", action="Index", id = RouteParameter.Optional} 
); 


//Everything that is not Help or Authentication will use this route, which will check for the valid token you mention 
//This route is defaulting to /Transaction/GetNewTaskId  
_config.Routes.MapHttpRoute(
    name: "AuthenticatedOnly", 
    routeTemplate: "{controller}/{action}/{id}", 
    defaults: new { controller = "Transaction", action="GetNewTaskId", id=RouteParameter.Optional}, 
    handler: tokenInspector 
); 
+0

답변 해 주셔서 감사합니다! 제안 된 변형을 시도했지만 시나리오가 2가됩니다. –

+0

도움말 및 인증은 가지고있는 유일한 공용 컨트롤러입니까? –

+0

모든 컨트롤러는 '공개'로 표시되고, 도움말 및 인증이있는 메소드는 모든 사용자가 사용할 수 있어야하며, 유효한 컨트롤러 토큰이 있으면 트랜잭션 컨트롤러에 대한 요청을 확인해야합니다. –

0

사용 insomnium_

안부,보다 유연한 방법 액세스 관리를위한이 방법은

config.Routes.MapHttpRoute(
    name: "PublicMethods", 
    routeTemplate: "api/{controller}/{action}", 
    constraints: new {action = @"^(public)-(.)*$"}, 
    defaults: new {controller = "Account"} 
); 

config.Routes.MapHttpRoute(
    name: "PublicControllers", 
    routeTemplate: "api/{controller}/{action}", 
    constraints: new {controller = @"^(Environment|Account)$"}, 
    defaults: new {controller = "Account"} 
); 

config.Routes.MapHttpRoute(
    name: "AuthorizedUsersOnly", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: null, 
    handler: tokenInspector 
); 

는 그래서 각 사용자 컨트롤러 오픈 몇이하고 필요하다면 나는하지 않는 몇 가지 방법에 액세스 할 수 있도록 액션 이름에 'public'접두어를 추가하여 승인 된 사용자