Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将对WCF restful函数的访问限制在特定的IP范围内?_C#_Wcf_Rest_Iis 7 - Fatal编程技术网

C# 如何将对WCF restful函数的访问限制在特定的IP范围内?

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?您的代码可能

我已经构建了一个Restful WCF服务,其中包含一些简单的功能。提出了新的要求

其中一个功能应仅可供特定ip范围访问

实现这一点的最佳方式是什么?我认为一个简单的方法是简单地用一个规则配置IIS,该规则将根据请求模式阻止ip范围-找不到这样的选项

谢谢! ofer

耦合选项: -你可以使用防火墙来完成这项工作

  • 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,您应该能够做到这一点。