通过Message Inspector限制访问WCF服务Client的IP Address

Step 1: Create the MessageInspector and EndpointBehavior:

public class RequestSourceEndpointBehavior : IEndpointBehavior, IDispatchMessageInspector
	{
        private static readonly Logger.ILog log = Logger.CreateLog();

        public String AllowedHosts { get; set; }

	    public void Validate(ServiceEndpoint endpoint)
	    {

	    }

	    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
	    {

	    }

	    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
	    {
	        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(this);
	    }

	    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
	    {
	        
	    }

        public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
        {
            RemoteEndpointMessageProperty remoteEndpoint = request.Properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
            IPAddress address = IPAddress.Parse(remoteEndpoint.Address);
            var dnsEntry = Dns.GetHostEntry(address);
            var hostname = dnsEntry.HostName.ToString();
            
            Console.WriteLine(address.ToString());
            Console.WriteLine(hostname);

            log.Info(String.Format("Request comes from {0}", hostname));

            if (!IsRequestSourceAllowed(hostname))
            {
                log.Error(String.Format("Request comes from {0} is denied", hostname));
                throw new WebFaultException<String>(String.Format("Failed : Request Source {0} is not allowed", hostname), 
                    HttpStatusCode.Forbidden);
            }

            return instanceContext;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {

        }

        private bool IsRequestSourceAllowed(String hostname)
        {
            return AllowedHosts.Split(',').Any(hostname.Contains);
        }
	}

Step 2: Create Endpoint Extension:

public class RequestSourceEndpointBehaviorExtension : BehaviorExtensionElement
	{
        [ConfigurationProperty("allowedHosts")]
	    public String AllowedHostnames
	    {
	        get { return this["allowedHosts"] as string; }
            set { this["allowedHosts"] = value; }
	    }

        private static readonly Logger.ILog log = Logger.CreateLog();

	    protected override object CreateBehavior()
	    {
            log.Info("RequestSourceEndpointBehavior is init with config allowed hosts: " + AllowedHostnames);
	        var behavior = new RequestSourceEndpointBehavior();
	        behavior.AllowedHosts = this.AllowedHostnames;
	        return behavior;
	    }

	    public override Type BehaviorType
	    {
	        get { return typeof(RequestSourceEndpointBehavior); }
	    }
	}

Step 3: Apply Message Inspector in Config:

Adding the extension first under system.serviceModel/extensions/behaviorextensions

then, in the endpoint behavior binding include the custom message inspector.


Note:

WebFaultException from .NET 4.0 is used to allow the custom error message.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值