2013-06-26 127 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

相關問題