2013-06-26 94 views
4

我有一个ASP.NET Web API项目有两个控制器,其中一个我想通过互联网公开寻址,另一个我只想通过网络在内部调用。ASP.NET Web API专用控制器

,我可以拿出迄今为止最好的解决办法是让公众控制器路由模板和内部的模板: -

routeTemplate:“API/{控制器}/{ID}”

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

这样我可以配置IIS以阻止对'privateapi'路由的请求。

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

谢谢。

回答

7

在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,并阻止所有的流量不从白名单中,而不是依靠应用程序逻辑来阻止坏人。

-1

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

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

+0

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

+0

OP的建议将会起作用。 – CodeCaster

相关问题