PC:Windows 8.1 +所有更新,VS 2012 +所有更新。
我已经创建了一个我测试过的WCF服务。我想对Windows Phone 8应用程序使用此服务,因此需要创建一个basicHttpBinding
服务,该服务接受用户名和密码才能访问数据。以下是我在完成在IIS上成功运行的服务后所采取的步骤。
更改了我的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" />
导航到http://localhost/Service/Service.svc
并收到403.4消息(无法使用SSL无法访问),这是正确的,因此我将http
替换为https
,我可以查看该服务页。
知道它可以使用https
我打开WCF测试客户端工具并导航到相同的URL并得到错误(请注意我已经缩短了一些错误并留在了主要内容中区域)
错误:无法从
https://localhost/Service/service.svc
获取元数据如果这是您有权访问的Windows(R)Communication Foundation服务,请检查您是否已在指定地址启用元数据发布。
元数据包含无法解析的引用:“https://localhost/Service/service.svc
” 无法与权限“localhost”建立SSL / TLS安全通道的信任关系 底层连接已关闭:无法为SSL / TLS安全通道建立信任关系 根据验证程序,远程证书无效.HTTP GET错误
我从IIS导出证书并将其安装在本地计算机和用户下 受信任的根证书颁发机构。没有区别
所以现在我有点失落,因为无论我尝试过什么似乎都不起作用。有人可以建议吗?
答案 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%确定它会对你有用,具体取决于你的其他配置