【问题标题】:Two endpoints for same service in WCF, one secured one notWCF 中相同服务的两个端点,一个安全一个不安全
【发布时间】:2011-05-11 12:32:25
【问题描述】:

我有一个在 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 还很陌生,所以额外的细节真的很有帮助,谢谢!

【问题讨论】:

    标签: c# .net wcf iis-6


    【解决方案1】:

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

    <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 都是试错调试,直到您准确地确定哪个元素运行不正确。如果我给您的信息不起作用,请说明您的问题的更多症状,我会尽力提供进一步的帮助。

    【讨论】:

    • 不是 bindingNamespace 将是 httpS 吗? URI(或 baseaddress)是 https://mydomain/myservice ?
    • 您的命名空间是一个 URI,它唯一地限定服务绑定元数据中的 XML 元素,因此它们是明确的。它可以是任何 URI 值,但通常它需要 URL 的 from 以使其具有一些人类可读性。当您想在该位置提供某种形式的文档时,通常会使用方案 http://。
    【解决方案2】:

    使用配置为

    <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="SecuredAccessToMyService"很重要。现在,当您从 client 调用 URl 时,您需要将 URI 称为 http://localhost/MyService/UnSecuredAccessToMyService.svc/UnSecuredAccessToMyService 以进行 Unsecured Access 和 http://localhost/MyService/UnSecuredAccessToMyService.svc/SecuredAccessToMyService 用于安全访问。

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

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

    【讨论】:

    • 安全将是 httpS 吗? URI(或 baseaddress)是 https://mydomain/myserviceHTTPS://localhost/MyService/UnSecuredAccessToMyService.svc
    猜你喜欢
    • 1970-01-01
    • 2012-07-07
    • 2021-04-13
    • 2017-02-11
    • 1970-01-01
    • 2012-11-12
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多