将 WCF 服务访问权限限制为仅使用控制台应用程序托管的本地主机
Restricting WCF Service access to only localhost which is hosted using console application
我对 WCF.I 有一个使用控制台应用程序托管的 WCF 服务还很陌生,但是,需要从同一台机器上托管的 C# web 服务调用 WCF。那么如何限制端点访问环回 ip,即 127.0.0.1
现在我可以访问托管在不同机器上的 WCF 服务端点(比如 10.X.X.X)。例如,我可以键入 http://10.X.X.X/api/v1/getStatus 并获取响应。这个 url 应该被限制。我的要求只是 http://localhost/api/v1/getStatus 应该能够从托管的 WCF 服务获取响应。
根据您的具体情况,您可以使用命名管道。 https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-transport?redirectedfrom=MSDN
在你给的link中,IPFilter是一个自定义节点,实现了IDispatchMessageInspector接口来拦截IP。这是我的演示:
public class ServerMessageLogger : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty =
messageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
if (endpointProperty.Address.Equals("::1"))
{
Console.WriteLine("OK");
}
else
{
reply = null;
}
}
}
我们需要实现 IDispatchMessageInspector 接口。服务器向客户端发送响应时,首先判断客户端的IP地址是否为localhost。如果不是本地主机,服务器将 return 一个空响应。
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
public class CustContractBehaviorAttribute : Attribute, IContractBehavior
{
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
return;
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
return;
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
return;
}
}
然后我们需要在服务的行为中添加ServerMessageLogger。
最后,您需要将 CustContractBehavior 应用于服务。
我对 WCF.I 有一个使用控制台应用程序托管的 WCF 服务还很陌生,但是,需要从同一台机器上托管的 C# web 服务调用 WCF。那么如何限制端点访问环回 ip,即 127.0.0.1
现在我可以访问托管在不同机器上的 WCF 服务端点(比如 10.X.X.X)。例如,我可以键入 http://10.X.X.X/api/v1/getStatus 并获取响应。这个 url 应该被限制。我的要求只是 http://localhost/api/v1/getStatus 应该能够从托管的 WCF 服务获取响应。
根据您的具体情况,您可以使用命名管道。 https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/choosing-a-transport?redirectedfrom=MSDN
在你给的link中,IPFilter是一个自定义节点,实现了IDispatchMessageInspector接口来拦截IP。这是我的演示:
public class ServerMessageLogger : IDispatchMessageInspector
{
public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
return null;
}
public void BeforeSendReply(ref Message reply, object correlationState)
{
OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty =
messageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
if (endpointProperty.Address.Equals("::1"))
{
Console.WriteLine("OK");
}
else
{
reply = null;
}
}
}
我们需要实现 IDispatchMessageInspector 接口。服务器向客户端发送响应时,首先判断客户端的IP地址是否为localhost。如果不是本地主机,服务器将 return 一个空响应。
[AttributeUsage(AttributeTargets.Interface | AttributeTargets.Class, AllowMultiple = false)]
public class CustContractBehaviorAttribute : Attribute, IContractBehavior
{
public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
return;
}
public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
return;
}
public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.MessageInspectors.Add(new ServerMessageLogger());
}
public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
{
return;
}
}
然后我们需要在服务的行为中添加ServerMessageLogger。
最后,您需要将 CustContractBehavior 应用于服务。