ASP.NET Web API专用控制器

ASP.NET Web API专用控制器,asp.net,asp.net-mvc,web-services,asp.net-web-api,Asp.net,Asp.net Mvc,Web Services,Asp.net Web Api,我有一个带有两个控制器的ASP.NET Web API项目,其中一个我希望通过internet公开寻址,另一个我只希望通过网络在内部调用 到目前为止,我能想到的最佳解决方案是为公共控制器提供路由模板,为内部控制器提供模板:- routeTemplate:“api/{controller}/{id}” routeTemplate:“privateapi/{controller}/{id}” 这样我就可以配置IIS来阻止对“privateapi”路由的请求 这是处理这种情况的最佳方法吗 谢谢。你不能

我有一个带有两个控制器的ASP.NET Web API项目,其中一个我希望通过internet公开寻址,另一个我只希望通过网络在内部调用

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

routeTemplate:“api/{controller}/{id}”

routeTemplate:“privateapi/{controller}/{id}”

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

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

谢谢。

你不能这样做! 您所做的只是为控制器创建另一条路由

如果在线部署,则可以访问它们。
现在,您需要在外部计算机和内部计算机上分别部署两种不同的API。

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

要在代码中实现这一点,可以执行如下操作,使用自定义authorized属性过滤未经授权的用户

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并阻止来自白名单的所有非流量,而不是依赖应用程序逻辑将坏人拒之门外。

CarlosB是正确的,这是一个安全/防火墙解决方案,而不是代码解决方案。