자체 호스팅 웹 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();
아마, 그것이 같은 문제는, 이런 식으로 대답 할 수없는을 , 어쨌든, 당신의 노력에 감사드립니다!
답변 해 주셔서 감사합니다! 제안 된 변형을 시도했지만 시나리오가 2가됩니다. –
도움말 및 인증은 가지고있는 유일한 공용 컨트롤러입니까? –
모든 컨트롤러는 '공개'로 표시되고, 도움말 및 인증이있는 메소드는 모든 사용자가 사용할 수 있어야하며, 유효한 컨트롤러 토큰이 있으면 트랜잭션 컨트롤러에 대한 요청을 확인해야합니다. –