Wcf 如何使用端点的TransportWithMessageCredential安全模式验证wsdl get?

Wcf 如何使用端点的TransportWithMessageCredential安全模式验证wsdl get?,wcf,iis,wcf-binding,wcf-security,Wcf,Iis,Wcf Binding,Wcf Security,我有一个WCF端点,它公开了一个带有basicHttpBinding的API。此投标设置为使用安全模式TransportWithMessageCredentialandUserName进行clientCredentialType 因为安全性是在消息级别实现的,所以在WCF上,IIS需要允许匿名访问。因此,可以在不提供任何凭据的情况下获取wsdl 如何强制身份验证以获取服务元数据 在这里,当前的服务配置看起来像(来自web.config) 我尝试使用服务行为配置为metatada设置特定绑定:

我有一个WCF端点,它公开了一个带有
basicHttpBinding
的API。此投标设置为使用安全模式
TransportWithMessageCredentialand
UserName
进行
clientCredentialType

因为安全性是在消息级别实现的,所以在WCF上,IIS需要允许匿名访问。因此,可以在不提供任何凭据的情况下获取wsdl

如何强制身份验证以获取服务元数据

在这里,当前的服务配置看起来像(来自web.config)


我尝试使用服务行为配置为metatada设置特定绑定:

<behavior name="secure">          
   <serviceMetadata httpsGetEnabled="true" httpsGetBinding="basicHttpBinding" httpsGetBindingConfiguration="transportSecure" />
</behavior>

//and add the new binding    
  <basicHttpBinding>
      <binding name="transportSecure">
        <security mode="Transport">
          <message clientCredentialType="UserName" />
        </security>
      </binding>
    </basicHttpBinding>

//并添加新的绑定
但它不受支持。它抛出了这样的信息:

MessageVersion'Soap11() 地址无 ()“不是 在本场景中支持。仅MessageVersion“信封”一个 ()地址无 ()是 支持


我不理解这个错误,也不知道如何避免它。

通常我们不会在生产环境中公开我们的元数据,但是如果您想启用元数据,我们可以使用https绑定来保护元数据

1.使用适当的X.509证书配置端口。证书必须来自受信任的机构,并且必须具有“服务授权”的预期用途。必须使用HttpCfg.exe工具将证书附加到端口

2.创建ServiceMetadataBehavior类的新实例

3.将ServiceMetadataBehavior类的HttpsGetEnabled属性设置为true

4.将HttpsGetUrl属性设置为适当的URL。请注意,如果指定绝对地址,则URL必须以https:///方案开头。如果指定相对地址,则必须为服务主机提供HTTPS基址。如果未设置此属性,则默认地址为“”,或直接位于服务的HTTPS基址

5.将实例添加到ServiceDescription类的behaviors属性返回的behaviors集合中,如下代码所示

ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);

myServiceHost.Open();
这是在WCF上启用的身份验证,您还可以在IIS上启用windows身份验证,这两种方法都可以保护元数据

但是在生产环境中,我不建议您启用元数据,因为这会导致元数据泄漏的风险。WCF服务的调用也可以通过channel factory调用。在这种情况下,我们可以在不知道服务器元数据的情况下调用WCF服务

有关如何保护元数据的详细信息,请参阅以下链接:


通常我们不会在生产环境中公开我们的元数据,但是如果您想启用元数据,我们可以使用https绑定来保护元数据

1.使用适当的X.509证书配置端口。证书必须来自受信任的机构,并且必须具有“服务授权”的预期用途。必须使用HttpCfg.exe工具将证书附加到端口

2.创建ServiceMetadataBehavior类的新实例

3.将ServiceMetadataBehavior类的HttpsGetEnabled属性设置为true

4.将HttpsGetUrl属性设置为适当的URL。请注意,如果指定绝对地址,则URL必须以https:///方案开头。如果指定相对地址,则必须为服务主机提供HTTPS基址。如果未设置此属性,则默认地址为“”,或直接位于服务的HTTPS基址

5.将实例添加到ServiceDescription类的behaviors属性返回的behaviors集合中,如下代码所示

ServiceMetadataBehavior sb = new ServiceMetadataBehavior();
sb.HttpsGetEnabled = true;
sb.HttpsGetUrl = new Uri("https://myMachineName:8036/myEndpoint");
myServiceHost.Description.Behaviors.Add(sb);

myServiceHost.Open();
这是在WCF上启用的身份验证,您还可以在IIS上启用windows身份验证,这两种方法都可以保护元数据

但是在生产环境中,我不建议您启用元数据,因为这会导致元数据泄漏的风险。WCF服务的调用也可以通过channel factory调用。在这种情况下,我们可以在不知道服务器元数据的情况下调用WCF服务

有关如何保护元数据的详细信息,请参阅以下链接: