代码之家  ›  专栏  ›  技术社区  ›  nash

WCF中同一服务的两个端点,一个安全的端点不是

  •  9
  • nash  · 技术社区  · 14 年前

    我有一个.Net服务在IIS 6和WCF上运行,我想为它创建两个端点。一个使用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 回复  |  直到 14 年前
        1
  •  7
  •   Paul Turner    14 年前

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

    <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)和基本客户端身份验证。

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

    不幸的是,许多WCF都是反复调试的,直到您确切地确定哪个元素没有正确运行。如果我提供的信息不起作用,请详细说明问题的更多症状,我会尽力提供进一步的帮助。

        2
  •  1
  •   Anil Rajan    10 年前

    将配置用作

    <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>
    

    请注意 address=“UnSecuredAccessToMyService” address=“安全数据访问服务” 对于端点部分非常重要。现在当你从 客户 您需要将URI调用为 http://localhost/MyService/UnSecuredAccessToMyService.svc/ 不安全的访问服务 对于不安全的访问和 http://localhost/MyService/UnSecuredAccessToMyService.svc/ 安全访问服务 用于安全访问。

    BaseAddress应该是完全限定名,包括 .svc公司

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