在我们基于ServiceStack(v3)的API中,我们提供了一些仅供内部使用的服务,因此我们在所有内部请求DTO上都添加了[Restrict(InternalOnly = true)]
属性。
问题在于我们使用负载平衡,并且受限制的服务可供所有人公开访问,因为调用API的IP始终是负载均衡器的IP,因此也是内部IP。
有没有办法绕过这一点,以便内部服务仅限于内部IP,除了负载均衡器的IP?
答案 0 :(得分:3)
我还没有看到内置的方式(See [Restrict]
tests)来限制基于特定的IP。但是,您可以使用自定义属性自行过滤请求:
public class AllowLocalExcludingLBAttribute : RequestFilterAttribute
{
public override void Execute(IHttpRequest req, IHttpResponse res, object requestDto)
{
// If the request is not local or it belongs to the load balancer then throw an exception
if(!req.IsLocal || req.RemoteIp == "10.0.0.1")
throw new HttpError(System.Net.HttpStatusCode.Forbidden, "403", "Service can only be accessed internally");
}
}
然后,您只需在服务或操作方法上添加[AllowLocalExcludingLB]
,否则您将使用[Restrict]
属性或将其与其他限制结合使用。 将10.0.0.1
替换为负载均衡器IP。