考慮一個WCF服務,其中的意圖是在傳輸層需要客戶端證書(客戶端證書在IIS中設置爲「必需」)。同樣,在消息層將會有用戶名認證。如何在WCF客戶端提供用戶名和客戶端證書(爲什麼這個例子工作)?
現在,我已經看到了這個問題已經:
WCF Client Certificate AND UserName Credentials forbidden
,我能有所瞭解發生了什麼事情在那裏,並認識到固有的WCF不允許兩者。我在上面引用的鏈接中通過了代碼中的相同步驟,並找到了相同的結果...消息級UserName憑證正在傳遞(在我的情況下是在SOAP頭中),但客戶證書(儘管存在當在VS調試中查看請求客戶端時附加)實際上未被端點處理。
所以現在出現讓我困惑的部分。我決定稍微修改一下。 我想知道爲什麼這個工程完全像我想要的那樣...它通過IIS客戶端證書要求,用戶名得到傳遞給WCF服務,所有的只是工作。然而WCF不允許我僅僅使用WCF配置文件或代碼(我可以找到)來完成它。爲什麼?
// sets up a proxy client based on endpoint config
// basically just here to get the URL.
this.InitializeSubmitClient();
// these get used to create the HttpWebRequest
string url = this.submitClient.Endpoint.Address.ToString();
string action = "SubmitCDA";
// this deserializes an XML file which is the "shell" of SOAP document and inject username/password into SOAP Security node
XmlDocument soapEnvelopeXml = XMLHelper.CreateSoapDocument(this.txtSubmitCdaXmlFile.Text, this.txtAdAccount.Text, this.txtPassword.Text);
HttpWebRequest webRequest = XMLHelper.CreateWebRequest(url, action);
// saves the SOAP XML into the webRequest stream.
XMLHelper.InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);
// attach the cert
if (this.chkSendClientCert.Checked)
{
X509Certificate myCert = X509Certificate.CreateFromCertFile(@"C:\temp\CDX-IHAT_DevClientCert.cer");
webRequest.ClientCertificates.Add(myCert);
}
else
{
webRequest.ClientCertificates.Clear();
}
// begin async call to web request.
IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);
使事情進一步複雜化,適用於此的WCF服務是BizTalk服務。