在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,并阻止所有的流量不从白名单中,而不是依靠应用程序逻辑来阻止坏人。
CarlosB是对的,这是一个安全/防火墙解决方案,而不是代码解决方案。 – jlafay
OP的建议将会起作用。 – CodeCaster