情况就是这样。
我们有一台运行IIS 6的Windows Server 2003。
还有一个WCF服务。最重要的配置设置是:
<wsHttpBinding>
<binding name="wsHttpBinding">
<security mode="Message">
<message clientCredentialType="UserName"
establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
服务器使用名为TestWCFCert
的自签名X509证书,并使用<serviceCredentials>,<serviceCertificate>
编写。
并以身份
<identity>
<dns value="TestWCFCert" />
</identity>
对于客户端userName身份验证,服务器使用customUserNamePasswordValidatorType
,在实现中不会抛出任何异常,因此所有客户端都被排除在外。
客户端在WinXp Sp3机器上,配置非常相似。
它具有相同的身份<dns value="TestWCFCert" />
用于服务地址检查。
它还安装了TestWCFCert
证书以进行服务器身份验证。
<clientCredentials>
<serviceCertificate>
<authentication certificateValidationMode="None" />
<defaultCertificate findValue="TestWCFCert"
storeLocation="CurrentUser"
storeName="My" x509FindType="FindBySubjectName" />
</serviceCertificate>
</clientCredentials>
这是有效的。
如果有人试图将establishcontext
设置为true。
接下来发生:为某些客户端/服务器通话发送和接收2条消息。并且在第三条消息中,方法调用服务器抛出异常
无法找到上下文'xxxx'的协商状态。
那是怎么回事?如果没有EstablishContext
,negotiateServiceCredentials
无效?
下一个奇怪的情况是,如果我们尝试将negotiateServiceCredentials
设置为true(已禁用establishcontext
)。然后在客户端有“安全令牌请求包含无效或格式错误的元素”,服务器上没有例外。
服务在互联网上发布,操作非常简单
string GetData(int number);
mex也是httpGetEnabled。客户端不使用代理。