使用basicHttpBinding保护WCF服务

时间:2013-10-23 19:25:22

标签: wcf windows-phone-8 wcf-security

PC:Windows 8.1 +所有更新,VS 2012 +所有更新。

我已经创建了一个我测试过的WCF服务。我想对Windows Phone 8应用程序使用此服务,因此需要创建一个basicHttpBinding服务,该服务接受用户名和密码才能访问数据。以下是我在完成在IIS上成功运行的服务后所采取的步骤。

  1. 创建了一个SSL(按此处http://msdn.microsoft.com/en-us/library/hh556232.aspx执行了步骤)
  2. 更改了我的web.config文件,使其包含:

    <system.serviceModel>
    <services>
      <service behaviorConfiguration="NewBehavior1" name="Service">
        <endpoint address="" binding="basicHttpBinding" contract="IService"     bindingConfiguration="NewBinding1" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>
      <basicHttpBinding>
        <binding name="NewBinding1">
          <security mode="TransportWithMessageCredential" />
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MEX">
          <serviceMetadata/>
        </behavior>
        <behavior name="NewBehavior1">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom"
          customUserNamePasswordValidatorType="Service, Services" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"     multipleSiteBindingsEnabled="true" />
    

                     

  3. 导航到http://localhost/Service/Service.svc并收到403.4消息(无法使用SSL无法访问),这是正确的,因此我将http替换为https,我可以查看该服务页。

  4. 知道它可以使用https我打开WCF测试客户端工具并导航到相同的URL并得到错误(请注意我已经缩短了一些错误并留在了主要内容中区域)

      

    错误:无法从https://localhost/Service/service.svc获取元数据如果这是您有权访问的Windows(R)Communication Foundation服务,请检查您是否已在指定地址启用元数据发布。
      元数据包含无法解析的引用:“https://localhost/Service/service.svc”   无法与权限“localhost”建立SSL / TLS安全通道的信任关系   底层连接已关闭:无法为SSL / TLS安全通道建立信任关系   根据验证程序,远程证书无效.HTTP GET错误

  5. 我从IIS导出证书并将其安装在本地计算机和用户下 受信任的根证书颁发机构。没有区别

  6. 所以现在我有点失落,因为无论我尝试过什么似乎都不起作用。有人可以建议吗?

2 个答案:

答案 0 :(得分:1)

我会试一试......这种行为有几个潜在的原因。

A)如果您的客户端测试工具是在IE中构建的并且您的SSL证书是自签名的,那么IE总是会遇到IE不接受证书的问题,并且将证书添加到客户端的“可信”组中没有帮助。 IE讨厌自签名证书,并且通过MS的Import例程是浪费时间。

B)如果您的客户端测试工具是自构建的应用程序,则即使它是自签名的,您也不需要将证书添加到受信任的组。但是您可能需要将其添加到您的代码中(用于测试)以避免自签名证书故障:

System.Net.ServicePointManager.CertificatePolicy = New TrustAllCertificatePolicy()

C)假设您使用的是自签名证书,请注意创建证书的方式。在我提出这些命令之前,这对我来说是一个问题:

rem creates root authority file and cert in currentuser\root and gives it the right to sign certs 
makecert.exe -a sha1 -n CN=CAS_Temp_Authority %Host_Authority_Cert_Name% -sr LocalMachine -ss Root -sky signature -pe -r -sk MyNewKey -cy authority  

rem creates ssl cert, puts it in the currentuser\root authority and signs it based on the other certificate
makecert.exe  -n cn=%Host_URL% %Host_Cert_Name% -is root -ic %Host_Authority_Cert_Name%  -sky exchange -pe -sv %Host_Cert_PrivateKey% -eku 1.3.6.1.5.5.7.3.1

rem make the pfx file that will allow you to copy certs around with private keys
pvk2pfx -pvk %Host_Cert_PrivateKey% -spc %Host_Cert_Name% -pfx %Host_Cert_PFX% -f

您可以想象,由此生成的“权限”证书(* .cer文件)进入您的“受信任的根...”商店,另一个证书进入您的本地计算机/我的商店,但您想要将其作为* .pfx文件导入,而不是* .cer文件。至少那对我有用。

最后,如果A)和B)没有帮助,您可以尝试将SecurityMode从TransportWithMessageCredential更改为常规Transport,并查看是否有所不同。

祝你好运。排除这些WCF / SSL问题对每个人来说都很难。

答案 1 :(得分:0)

抱歉,我可能完全错了,但我注意到你的行为是这样的:

<behavior name="NewBehavior1">
  <serviceMetadata httpGetEnabled="true"/>
  <serviceCredentials>
    <userNameAuthentication userNamePasswordValidationMode="Custom"
  customUserNamePasswordValidatorType="Service, Services" />
  </serviceCredentials>

我想如果你想使用https,你必须像这样配置它:

<serviceMetadata httpsGetEnabled="true"/>enter code here

(服务元数据的httpS启用)。

我会尝试,但我不是100%确定它会对你有用,具体取决于你的其他配置