微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Web Api路由故障

我有一个自托管的Web API项目,所以我不得不使用 Yao’s blog post来帮助页面工作.接下来,我必须确保我的一些方法免遭未经授权的使用.我已经实施了 this idea.

现在有趣的部分.我有3条路线:

/ help导致帮助页面,

/ authentication / authenticate用于调用身份验证方法,它需要用户凭据并在成功时返回安全令牌

和/ transaction / {action} / {id}需要保护此路由不被未经授权的使用.

所以基本上,我需要让所有路径,其中controller = transaction,由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身份验证/身份验证
条目

2.场景:如果我将路由配置更改为:

_config.Routes.MapHttpRoute(
            name: "AuthenticatedOnly",defaults: new {},id = RouteParameter.Optional}
            );

帮助页面工作正常并显示所有方法,但/事务不再受到保护,并且无需令牌即可正常工作.

3.场景:

_config.Routes.MapHttpRoute(
                name: "AuthenticatedOnly",defaults: new {id=RouteParameter.Optional},handler: tokenInspector
                );

            _config.Routes.MapHttpRoute(
                "Default",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_

解决方法

//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",constraints: new  { controller = @"^(Help|Authentication)$" },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",defaults: new { controller = "Transaction",handler: tokenInspector
);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐