WCF 安全绑定问题

Posted

技术标签:

【中文标题】WCF 安全绑定问题【英文标题】:WCF security binding issue 【发布时间】:2012-03-08 00:20:32 【问题描述】:

您好,我将 WCF 服务作为 WebRole 托管在 Windows Azure 项目中

我的服务受到 SSL 证书的保护,这很有效。 现在我想在我的操作合同上添加一些额外的安全性,如果我这样做(设置保护级别)我会得到下一个错误。

我需要配置一些绑定或其他东西来完成这项工作,但我不知道是什么,也不知道在哪里。

项目信息:

错误:

    The request message must be protected. This is required by an operation of the contract ('IService1','http://tempuri.org/').
    The protection must be provided by the binding ('BasicHttpBinding','http://tempuri.org/').

架构

ServiceConfiguration.Cloud.cscfg & ServiceConfiguration.Local.cscfg

<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
  <Role name="WCFServiceWebRole">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />
    </ConfigurationSettings>
    <Certificates>
      <Certificate name="Certificate1" thumbprint="51F357715F" thumbprintAlgorithm="sha1" />
    </Certificates>
  </Role>
</ServiceConfiguration>

ServiceDefinition.csdef

<?xml version="1.0" encoding="utf-8"?>
<ServiceDefinition name="Azure" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition">
  <WebRole name="WCFServiceWebRole" vmsize="ExtraSmall" enableNativeCodeExecution="true">
    <Sites>
      <Site name="Web">
        <Bindings>
          <Binding name="Endpoint1" endpointName="Endpoint1" />
          <Binding name="Endpoint2" endpointName="Endpoint2" />
        </Bindings>
      </Site>
    </Sites>
    <Endpoints>
      <InputEndpoint name="Endpoint1" protocol="http" port="80" />
      <InputEndpoint name="Endpoint2" protocol="https" port="8080" certificate="Certificate1" />
    </Endpoints>
    <Imports>
      <Import moduleName="Diagnostics" />
    </Imports>
    <LocalResources>
      <LocalStorage name="WCFServiceWebRole.svclog" sizeInMB="1000" cleanOnRoleRecycle="false" />
    </LocalResources>
    <Certificates>
      <Certificate name="Certificate1" storeLocation="LocalMachine" storeName="My" />
    </Certificates>
  </WebRole>
</ServiceDefinition>

合同

[DataContract]
public class KlantenContract

    [DataMember]
    public int PARTYID  get; set; 

    [DataMember]
    public string firstName  get; set; 

    [DataMember]
    public string lastName  get; set; 

IService1.cs

namespace WCFServiceWebRole

    [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
    public interface IService1
    
        [OperationContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
        List<KlantenContract> GetAllKlanten(string firstName);
    

Web.config

  <system.serviceModel>

    <bindings>
      <wsHttpBinding>
        <binding name="IService1">
          <security mode="Transport"></security>
        </binding>
        <binding name="Certificate1">
          <security>
            <message clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <services>
      <service name="Service1" behaviorConfiguration="ServiceBehavior">
        <endpoint address="https://127.0.0.1:8080/Service1.svc" binding="wsHttpBinding"
          name="Endpoint2" contract="IService1">
        </endpoint>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>

          <behavior name="ServiceBehavior">
            <serviceMetadata httpGetEnabled="true" />
            <serviceDebug includeExceptionDetailInFaults="false" />
            <serviceCredentials>
              <serviceCertificate findValue="CN=tempCert" />
            </serviceCredentials>
          </behavior>

          <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

【问题讨论】:

【参考方案1】:

如果您将服务设置为 EncryptAndSign,则它必须使用安全传输,例如 HTTPS。我不知道您在上一个屏幕截图中是通过 HTTP 还是 HTTPS 查看服务,但您必须使用 HTTPS。

如果您希望 IIS 处理安全绑定,您只需将安全模式设置为 TransportWithCredentialOnly,并将您的 Web 角色配置为使用您的证书绑定到 443,我认为您已经完成了,然后它应该没问题。

或者,您可以使用传输安全性,并在 ServerCredential 部分中指定您希望 WCF 使用哪个证书来创建安全传输。

我从未尝试过消息安全模式,但我认为它应该可以工作,但您可能还需要在消息安全配置元素下指定证书。

【讨论】:

不,我仍然遇到同样的错误,但我想我的架构或配置有误??你看到我的结构 - >最后一个截图。我是否必须在 web.config 或 Azure 项目配置中配置绑定? 在您的 web.config 中。有时间我会看看然后回复你。 谢谢,太好了,我绑了很多东西,但它总是抛出同样的错误,就像他没有接受我的配置或者我配置错误..; 我在我的问题中添加了一些代码可能更容易找到问题

以上是关于WCF 安全绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

WCF SSL .pfx 绑定

使用 Xamarin 在可移植类库中保护 WCF 绑定

WCF自寄宿实现Https绑定

WCF系列 - WCF安全系列 - basicHttpBinding

WCF 身份验证 - 验证消息的安全性时出错

WCF基础:绑定