我有一个带有两个控制器的ASP.NET Web API项目,其中一个我想通过互联网公开寻址,另一个我只想通过网络在内部调用。
到目前为止,我能提出的最佳解决方案是为公共控制器提供路由模板,为内部提供模板: -
routeTemplate:“api / {controller} / {id}”
routeTemplate:“privateapi / {controller} / {id}”
这样我可以配置IIS来阻止对'privateapi'路由的请求。
这是处理这种情况的最佳方法吗?
感谢。
答案 0 :(得分: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 :(得分:-1)
你不能这样做! 你正在做的只是为你的控制器创建另一条路线。
如果他们在线部署,则可以访问。 现在您需要的是在外部机器上部署2个不同的API,在内部机器上部署另一个API。