WCF中相同服务的两个端点,一个不受保护

时间:2010-11-17 16:07:12

标签: c# .net wcf iis-6

我在IIS 6和WCF上运行了一个.Net服务,我想为它创建两个端点。一个使用HTTPS和基本身份验证进行保护,这些身份验证将从我们的DMZ和一个没有安全性的端点进行访问,只能从内部安全网络访问。防火墙和.Net过滤器将确保在安全网络外无法访问不安全的服务。

到目前为止,我还没有成功地让两个端点使用不同的安全参数。我试过的一种配置是:

<service name="My.Service">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost/MyService/"/>
        </baseAddresses>
    </host>
    <endpoint address="UnSecuredAccessToMyService.svc" 
              behaviorConfiguration="restBehavior" 
              name="UnSecureEndpoint" 
              binding="webHttpBinding"
              bindingName="SomeBindingName" 
              bindingNamespace="http://mydomain/myservice" 
              contract="Domain.MyService.MyClass" />
    <endpoint address="SecuredAccessToMyService.svc"
              behaviorConfiguration="secBehavior"
              name="SecuredEnpoint"
              binding="webHttpBinding"
              bindingConfiguration="customSecureBinding"
              bindingName="SecBindingName"
              bindingNamespace="http://mydomain/myservice"
              contract="Domain.MyService.MyClass" />
</service>

<behaviors>
    <endpointBehaviors>
        <behavior name="restBehavior">
            <webHttp />
        </behavior>
        <behavior name="secBehavior">
        </behavior>
    </endpointBehaviors>
</behaviors>

<bindings>
    <webHttpBinding>
        <binding name="customSecureBinding">
            <security mode="Transport">
                <transport clientCredentialType="Basic"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

文件UnSecuredAccessToMyService.svc和SecuredAccessToMyService.svc如下所示:

<%@ ServiceHost
    Factory="somefactory, anotherfactory"
    Service="My.Service, AnotherService"
%>

我是WCF和.Net的新手,因此额外的细节可以提供帮助,谢谢!

2 个答案:

答案 0 :(得分:7)

看起来你的绑定和行为有点混乱了。尝试将配置更改为以下内容:

<services>

    <service name="My.Service">
        <endpoint address="UnSecuredAccessToMyService.svc" 
                  binding="webHttpBinding"
                  bindingNamespace="http://mydomain/myservice" 
                  contract="Domain.MyService.MyClass" />

        <endpoint address="SecuredAccessToMyService.svc"
                  binding="webHttpBinding"
                  bindingName="secureWebHttpBinding" 
                  bindingNamespace="http://mydomain/myservice"
                  contract="Domain.MyService.MyClass" />
    </service>

</services>

<bindings>
    <webHttpBinding>
        <binding name="secureWebHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="Basic"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

这指定两个端点都应该使用WebHttpBinding,但是一个端点将使用默认绑定,另一个端点将使用命名绑定“secureWebHttpBinding”,该绑定配置为使用传输层安全性(SSL)和基本客户端身份验证。 / p>

这些不应该需要进一步的配置或自定义行为,除非您有超出默认内置的需求。

不幸的是,很多WCF都是试错法调试,直到您确切地确定哪个元素无法正常运行。如果我给你的信息不起作用,请指出问题的更多症状,我会尝试提供进一步的帮助。

答案 1 :(得分:1)

将配置用作

<service name="My.Service">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost/MyService/UnSecuredAccessToMyService.svc"/>
        </baseAddresses>
    </host>
    <endpoint address="UnSecuredAccessToMyService" 
              behaviorConfiguration="restBehavior" 
              name="UnSecureEndpoint" 
              binding="webHttpBinding"
              bindingName="SomeBindingName" 
              bindingNamespace="http://mydomain/myservice" 
              contract="Domain.MyService.MyClass" />
    <endpoint address="SecuredAccessToMyService"
              behaviorConfiguration="secBehavior"
              name="SecuredEnpoint"
              binding="webHttpBinding"
              bindingConfiguration="customSecureBinding"
              bindingName="SecBindingName"
              bindingNamespace="http://mydomain/myservice"
              contract="Domain.MyService.MyClass" />
</service>

请注意 地址=&#34; UnSecuredAccessToMyService&#34; 地址=&#34; SecuredAccessToMyService&#34; 对于端点部分非常重要。现在,当您从客户端调用URl时,您需要为不安全的访问调用URI http://localhost/MyService/UnSecuredAccessToMyService.svc/ UnSecuredAccessToMyService 安全访问的http://localhost/MyService/UnSecuredAccessToMyService.svc/ SecuredAccessToMyService

BaseAddress应该是完全限定的名称,包括 .svc

使用上述配置,您将能够使用相同的.svc文件,相同的合同,相同的操作/方法,但有2个不同的端点,1个安全和1个不安全。