如何在防火墙后面设置安全的WCF服务?
我有一个WCF服务,它是一个企业级的防火墙,这是做两个主机名和端口转换的背后,例如:如何在防火墙后面设置安全的WCF服务?
https://ws.address.com/Service.svc - >https://serv.internal.com:44000/Service.svc
该服务采用SSL安全-128和要求客户证书。
因为内部服务器名称是不是从防火墙外部访问,我们必须实现一个ServiceHostFactory翻译的WSDL和XSD导入引用了WCF生成:
public class MyCustomFactory : ServiceHostFactory
{
protected override ServiceHost CreateServiceHost(
Type serviceType, Uri[] baseAddresses)
{
MyCustomHost customServiceHost =
new MyCustomHost(serviceType, baseAddresses);
return customServiceHost;
}
class MyCustomHost : ServiceHost
{
public MyCustomHost(Type serviceType,
params Uri[] baseAddresses)
: base(serviceType,
GetBaseAddresses(serviceType, baseAddresses))
{
}
protected override void ApplyConfiguration()
{
base.ApplyConfiguration();
}
private static Uri[] GetBaseAddresses(
Type serviceType, params Uri[] baseAddresses)
{
UriBuilder newBaseAddress = new UriBuilder();
newBaseAddress.Path = "/" + serviceType.ToString() +
".svc";
// from config
newBaseAddress.Host =
MyCustomSettings.ServiceBaseAddress;
if (baseAddresses.Length > 0)
{
newBaseAddress.Scheme = baseAddresses[0].Scheme;
}
return new Uri[] { newBaseAddress.Uri };
}
}
}
下面是这个问题:除非服务是443默认SSL端口上的内部机器上托管,我们得到如下错误:
没有协议绑定指定的地址“https://ws.address.com/Service.svc”相匹配。协议绑定在IIS或WAS配置中的站点级别配置。
从修补程序看来,如果我们将内部服务器更改为在443上托管服务或将防火墙配置为从44000转发到44000,则一切正常。但是,这些不是我们生产环境中的选择。
编辑:忘了提,我们试图用一个IWsdlExportExtension扁平化WSDL,但导致在SvcUtil工具或VS2008代理代码生成严重的问题,所以我们就废弃了这个想法。
有没有人知道解决这个问题的方法?我正在拉我的头发!
提前致谢!
您可能需要显式创建您自己的绑定(即ServiceModel.WSHttpBinding)并添加具有该绑定的服务端点(.AddServiceEndpoint(..))。
你有没有试图把在地址的IP端口(从问题它看起来并不像它被用来每次):
https://ws.address.com:44000/Service.svc
另一件事,可能就是, WCF侦听HTTPS流量在该端口上,请参阅:
我认为问题在于,实时环境需要防火墙将ws.address.com:443的请求转发到内部地址serv.internal.com:44000 – davewasthere 2009-08-08 00:04:57
你不应该改变基本addresse在工厂里。写一个扩展来修改WSDL。这将是一个“IWsdlExportExtension”,你想覆盖ExportEndpoint来修改端点地址。这将使您的服务倾听正确的基地址。
OR
如果你不湾开始使用一个WSDL扩展...移动你的代码到“CreateServiceHost”的方法,并划伤您的自定义的主机!这不是很好,但应该工作。
你没有提到你的主机。 IIS/WAS?如果是这样,您可能需要将外部主机名添加到IIS配置到安全绑定列表。
here is some information on changing the host-name in IIS hosted service
这里是命令行:
cscript //nologo %systemdrive%\inetpub\adminscripts\adsutil.vbs
set W3SVC/1/SecureBindings "10.(internal addr).1:443:ws.address.com"
"127.0.0.1:443:Internal Host name"
如果不照顾它我会去用“routeNpingme”,并建议你只需要获得指定端点正确使用指定您的https端口和名称的绑定。我认为你可以用现有的绑定选项来做到这一点...但你可能需要创建一个自定义。
我的猜测是,托管服务在IIS中的站点的站点绑定配置为仅主机serv.internal.com听,而不是外部名称ws.address.com。
如果IIS站点绑定配置了主机名,则会根据所有传入的URL检查该主机名。只有具有匹配主机名的URL才能被该绑定处理。
防火墙将请求重定向到内部服务器,但不会改变传入的URL字符串...
请问有没有什么办法可以在端口443上托管你的内部服务?即使使用主机标题,如果有另一个站点已经在443上? – davewasthere 2009-08-08 00:07:55