我有一个自托管的Web API项目,所以我不得不使用Yao's blog post来帮助页面工作。接下来,我必须确保我的一些方法免遭未经授权的使用。我已经实施了this idea。
现在有趣的部分。我有3条路线:
/help
导致帮助页面,
/authentication/authenticate
用于调用身份验证方法,它需要用户凭据并在成功时返回安全令牌
和/transaction/{action}/{id}
此路由需要防止未经授权的使用。
所以基本上,我需要让TokenInspector
处理所有路径,其中controller = transaction,由<{1}}处理。
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();
可能这个问题无法以这种方式回答,但无论如何,谢谢大家的努力!
关心,insomnium _
答案 0 :(得分: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
);
答案 1 :(得分:0)
使用此方法进行更灵活的方法访问管理
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
);
所以我几乎没有为每个用户控制器开放,如果有必要,我可以通过添加公共&#39;公开&#39;来为非授权用户提供一些方法。前缀为操作名称