【发布时间】:2013-08-30 06:40:43
【问题描述】:
我有一个自托管的 Web API 项目,所以我必须使用 Yao's blog post 来使帮助页面正常工作。接下来,我必须保护我的一些方法免遭未经授权的使用。我已经实现了this idea。
现在是有趣的部分。我有 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();
大概是这样的问题,不能这样回答,不过还是谢谢大家的努力!
问候,失眠_
【问题讨论】:
标签: c# routing asp.net-web-api