繁体   English   中英

ASP.NET Web API 私人控制器

[英]ASP.NET Web API private controllers

我有一个带有两个控制器的 ASP.NET Web API 项目,其中一个我想通过 inte.net 公开寻址,另一个我只想通过 .network 在内部调用。

到目前为止,我能想到的最佳解决方案是为公共控制器提供一个路由模板,为内部控制器提供一个模板:-

routeTemplate: "api/{controller}/{id}"

routeTemplate: "privateapi/{controller}/{id}"

这样我就可以配置 IIS 来阻止对“privateapi”路由的请求。

这是处理这种情况的最佳方法吗?

谢谢。

在IIS中控制访问MVC和WebAPI的问题是,路由有时会使您很难确切地看到哪些路由最终会出现在您的控制器上。 在代码中限制访问也是完全有效的(并且在许多情况下是优选的)。

要在代码中执行此操作,您可以执行以下操作,使用自定义AuthorizeAttribute来过滤未经授权的用户。

public class InternalAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        if (actionContext.Request.Properties.ContainsKey("MS_HttpContext"))
        {
            var ipAddress =
                ((HttpContextWrapper) actionContext.Request.Properties["MS_HttpContext"]).Request.UserHostAddress;
            if (IsPrivateAddress(ipAddress))
            {
                return;
            }
        }

        actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Forbidden");
    }

    private bool IsPrivateAddress(string ipAddress)
    {
        // todo: verify ip address is in internal or otherwise whitelisted
    }
}

然后,您可以注释控制器并将过滤器应用于控制器中的所有操作。

[InternalAuthorize]
public class PrivateController : ApiController
{
}

注意:如果来自此控制器的信息/操作特别敏感,您可能希望部署应用程序的一个版本,该应用程序公开此私有API并阻止来自白名单的所有流量,而不是依赖应用程序逻辑来阻止坏人。

使用授权属性:

[Authorize(Roles = "Admin")]
public  class MyPrivateDataController :ApiController

你不能这样做! 你正在做的只是为你的控制器创建另一条路线。

如果他们在线部署,则可以访问。 现在您需要的是在外部机器上部署2个不同的API,在内部机器上部署另一个API。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM