在一个项目中扩展API会完全公开引用的API,但会引起冲突

时间:2018-09-18 03:46:54

标签: c# asp.net-core-webapi asp.net-web-api-routing

我正在尝试将Core 2.1 WebAPI项目分成两个,以便我们可以根据情况公开两个不同的API。简化了,我们有一个API,我们希望所有的只读(GET)请求都在一个API中,而整个请求都在另一个API中(“ admin” API)。在项目中启用了Swagger。

我复制了该项目,重命名了一个(命名空间等)并将其添加到同一解决方案中,然后注释掉了只读项目中的所有非GET控制器方法,并注释了管理员中的所有GET方法。项目。然后,我在admin项目中添加了对只读项目的引用。

运行只读项目,打开页面,只是GET。运行admin项目在swagger页面上给出了500。有趣的是,在调试过程中,我发现从admin项目中删除了所有控制器,从只读项目中删除了底层API,并完全发挥了功能-这不是我所期望的,对于任何不期望的人来说都是潜在的安全问题它。

但是,我然后又添加了一个控制器,并将其更改为从只读控制器之一下降的值,从而覆盖了祖先构造函数等。它仍然给出了500。

基类:

namespace InfoFeed.WebAPI.Features.Account
{
    /// <summary>
    /// Handle user account related tasks
    /// </summary>
    [Authorize]
    [Produces("application/json")]
    [Route("api/account")]
    public class AccountController : Controller
    {
        private readonly ILogger _log;
        protected readonly IMediator _mediator;

        public AccountController(ILogger<AccountController> log,
                                 IMediator mediator)
        {
            _log = log;
            _mediator = mediator;
        }

后代:

namespace InfoFeedAdmin.WebAPI.Features.Account
{
    /// <summary>
    /// Handle user account related tasks
    /// </summary>
    [Authorize]
    [Produces("application/json")]
    [Route("api/account")]
    public class AccountAdminController 
        : InfoFeed.WebAPI.Features.Account.AccountController
    {
        public AccountAdminController(ILogger<AccountAdminController> log,
                                 IMediator mediator)
            : base(log, mediator)
        {
        }

我认为该路线可能会引起冲突,因此我尝试将其更改为[Route(“ api / admin / account”)]-只要没有冲突方法签名,此方法就起作用。但是,这意味着有两组路由暴露给相同的基础控制器方法。

POST /api/account/signin
GET /api/account/signout

POST /api/admin/account/signin
GET /api/admin/account/signout

有人知道我如何(可能有选择地)隐藏祖先类中的路由,以便只有我选择从后代类中暴露的路由才可见/可访问?

欢呼

1 个答案:

答案 0 :(得分:3)

默认情况下,MVC将搜索依赖关系树并找到控制器(甚至在其他程序集中)。
您可以使用application parts来避免在特定的组件或位置中查找控制器。

如果您的程序集包含不想使用的控制器,请将其从ApplicationPartManager中删除:

services.AddMvc()
.ConfigureApplicationPartManager(apm =>
{
    var dependentLibrary = apm.ApplicationParts
        .FirstOrDefault(part => part.Name == "DependentLibrary");

    if (dependentLibrary != null)
    {
       p.ApplicationParts.Remove(dependentLibrary);
    }
})
  

来源:https://docs.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts?view=aspnetcore-2.1