在一个项目中扩展API会完全暴露引用的API但路由冲突

问题描述 投票:0回答:1

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

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

运行只读项目,swagger页面很好,只有GET。运行管理项目在swagger页面上给出了500。有趣的是,在调试期间,我发现从管理项目中删除所有控制器,来自只读项目的底层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

有没有人知道我如何隐藏(可能有选择地)来自祖先类的路由,以便只有我选择从后代类公开的路由可见/可访问?

干杯

c# asp.net-core-webapi asp.net-web-api-routing
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.