C# 如何将对WCF restful函数的访问限制在特定的IP范围内?
我已经构建了一个Restful WCF服务,其中包含一些简单的功能。提出了新的要求 其中一个功能应仅可供特定ip范围访问 实现这一点的最佳方式是什么?我认为一个简单的方法是简单地用一个规则配置IIS,该规则将根据请求模式阻止ip范围-找不到这样的选项 谢谢! ofer耦合选项: -你可以使用防火墙来完成这项工作C# 如何将对WCF restful函数的访问限制在特定的IP范围内?,c#,wcf,rest,iis-7,C#,Wcf,Rest,Iis 7,我已经构建了一个Restful WCF服务,其中包含一些简单的功能。提出了新的要求 其中一个功能应仅可供特定ip范围访问 实现这一点的最佳方式是什么?我认为一个简单的方法是简单地用一个规则配置IIS,该规则将根据请求模式阻止ip范围-找不到这样的选项 谢谢! ofer耦合选项: -你可以使用防火墙来完成这项工作 IIS具有阻止ip的功能,但您必须在IIS中承载服务 您可以使用WCF获取客户端地址,然后接受/拒绝呼叫 参考: 您是否尝试过实施IParameterInspector?您的代码可能
- IIS具有阻止ip的功能,但您必须在IIS中承载服务
- 您可以使用WCF获取客户端地址,然后接受/拒绝呼叫
您是否尝试过实施
IParameterInspector
?您的代码可能如下所示:
public class IPFilterAttribute : Attribute, IOperationBehavior, IParameterInspector
{
private string _rangeFrom;
private string _rangeTo;
public IPFilterAttribute(string rangeFrom, string rangeTo)
{
_rangeFrom = rangeFrom;
_rangeTo = rangeTo;
}
public void ApplyDispatchBehavior(
OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
dispatchOperation.ParameterInspectors.Add(this);
}
public void AfterCall(string operationName, object[] outputs,
object returnValue, object correlationState)
{
}
public object BeforeCall(string operationName, object[] inputs)
{
RemoteEndpointMessageProperty clientEndpoint =
OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
if (!IsClientInInRange(clientEndpoint.Address))
{
throw new SecurityException(string.Format("Calling method '{0}' is not allowed from address '{1}'.", operationName, clientEndpoint.Address));
}
return null;
}
private bool IsClientInRange(string clientAddress)
{
// do the magic to check if client address is in the givn range
}
public void AddBindingParameters(OperationDescription operationDescription, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
{
}
public void Validate(OperationDescription operationDescription)
{
}
}
然后,您只需使用以下属性装饰web方法:
[OperationContract]
[WebInvoke(...)]
[IPFilter("64.18.0.0", "64.18.15.255")]
string GetData(string value);
使用IIS 7,您应该能够做到这一点。