Web config 同一WCF配置文件中的消息级安全性和传输级安全性

Web config 同一WCF配置文件中的消息级安全性和传输级安全性,web-config,wcf-security,Web Config,Wcf Security,我正在尝试为我正在编写的WCF应用程序设置消息级安全性。此应用程序已具有使用传输级别安全性设置的终结点。我可以设置另一个具有消息级安全性的端点吗?顺便说一下,此应用程序正在IIS上运行。我在同一个配置文件中设置了一个单独的服务,如下所示 <service name="generalName"> <endpoint address=...> . . . </service> <service name="generalName2"&g

我正在尝试为我正在编写的WCF应用程序设置消息级安全性。此应用程序已具有使用传输级别安全性设置的终结点。我可以设置另一个具有消息级安全性的端点吗?顺便说一下,此应用程序正在IIS上运行。我在同一个配置文件中设置了一个单独的服务,如下所示

<service name="generalName">
  <endpoint address=...>
   .
   .
   .
</service>
<service name="generalName2">
   <endpoint address=""...>
</service>

.
.
.
我问这个问题的原因是因为我认为我已经安排好了一切,我认为它可以工作。但是当我尝试访问以前的服务时,我得到以下错误

此服务的安全设置 需要Windows身份验证,但它 未为IIS应用程序启用 承载此服务的

我知道以前的服务是有效的,因为我可以在设置第二个服务之前访问它


有什么建议吗?我应该尝试在这里编写一个完全独立的服务,还是有办法解决这个问题?

不知道您使用什么绑定—取决于该绑定是否同时支持传输和消息安全—是的,当然您应该能够公开两个端点,一个具有传输安全性,另一个具有消息安全性

由于这实际上只是一个具有两个端点的服务,因此您的配置应该是这样的(我选择了
wsHttpBinding
作为示例-根据需要进行调整):


基本上,您定义了两个绑定配置,然后一个服务有两个端点,一个使用传输安全绑定配置,另一个端点使用消息安全绑定配置


当然,这两个端点不能具有相同的地址-因此需要提供两个单独的(相对的)端点每个端点的地址。

您使用的是哪种绑定?还记得配置IIS以禁用匿名访问并仅启用Windows身份验证,因为@marc_的示例要求在每个服务请求中传递Windows标识。WCF客户端将自动提供Windows标识,因此除配置文件外,您不需要更改任何内容。@Sixto Saez:这只是我的猜测-wsHttpBinding还支持其他传递客户端凭据的方法,如用户名或证书等。对,根据我在问题中看到的一个例外,我也在猜测同样的情况。谢谢谢谢你的回复!您说过“因为这是一个具有两个端点的服务”。。。我的申请并非如此(如果我正确理解你的意思)。我有两个服务(在同一个项目中,两个类尝试从同一个服务合同中请求服务)。我已经设置了两个绑定和两个端点。对于Saez,对于我所在的特定子站点,匿名访问和windows身份验证都已设置为正确的设置。根站点是否应该设置这些选项?我正在运行iis7。
  <system.serviceModel>
    <bindings>
      <wsHttpBinding>
        <binding name="TransportSec">
          <security mode="Transport">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
        <binding name="MessageSec">
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service name="YourService" >
        <endpoint name="Transport" 
              address="Transport"
              binding="wsHttpBinding"
              bindingConfiguration="TransportSec"
              contract="IYourService" />

        <endpoint name="Message"
              address="Message"
              binding="wsHttpBinding"
              bindingConfiguration="MessageSec"
              contract="IYourService" />
      </service>
    </services>
  </system.serviceModel>