4

我使用HTTPWebRequest訪問需要客戶端證書的頁面!如何檢測HTTPWebRequest中的客戶端證書身份驗證請求?

我使用下面的代碼,一切正常!

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(textBox1.Text); 

    X509Certificate2 userCert = SelectClientCertificate(); 
    if (userCert != null) myReq.ClientCertificates.Add(userCert); 

    HttpWebResponse myResp = (HttpWebResponse)myReq.GetResponse(); 

現在,這裏是我的問題,因爲我的電話SelectClientCertificate()顯示一個對話框,讓用戶選擇一個證書,我不想顯示對話框,如果服務器不要求客戶端身份驗證!其實我正在尋找Internet Explorer的行爲主義。如果訪問服務器需要用戶客戶端認證的頁面,則會顯示證書選擇對話框,否則不顯示!

我看着AuthenticationManager,但我不確定是否真的需要註冊我自己的AuthenticationModule!所以對我有什麼暗示?

我也檢查了403或403.7的StatusCode,但現在與我一起工作的服務器在丟失證書的情況下也會返回200,內容說我沒有被授權!

+0

嗨,你有沒有找到解決這個問題? – Zaky 2012-10-10 12:22:54

+0

嗨,我也有興趣在解決方案,如果你有一個。 – ianbeks 2013-04-11 11:34:56

+0

我有同樣的問題。 – justcoding124 2014-04-30 21:08:32

回答

0

爲什麼你想檢查服務器想要什麼?它的請求通過https運行,只是要求提供證書。

如果我沒記錯的話,服務器沒有義務給任何人做任何事情。開始與SSL握手的通信並且客戶端/服務器在任何真正的HTTP通信發生之前交換其證書是客戶的責任。您無法檢測服務器是否「要求」您提供證書。如果您嘗試與之交談,並且如果您沒有從證書開始,並且服務器需要證書,則服務器將斷開連接並保持沉默,或者它可能會返回一些隨機錯誤代碼。

在嘗試創建/發送請求之前,您可以嘗試儘早檢測服務器是否嘗試握手,但是您必須在TCP層下面執行一層。嘗試檢查描述HTTPS協商的RFC或可能的握手信號,這可能會對您有所幫助。

或者只是嘗試執行HTTP無需S請求,如果失敗,請重新提交證書並使用HTTPS重試。我認爲你的用戶會存活下來。

+0

如果需要的服務器將請求客戶端發送其證書。檢查SSL中的相互身份驗證。你的陳述是錯誤的。 – justcoding124 2014-04-30 21:10:35

+0

它可能聽起來有點混亂,因爲我混合了一般答案和關於HttpWebRequest類的可能性的提示。問題在於,(AFAIR)HWR類沒有公開任何「I-Demand-A-Certificate」事件或擴展點。您必須在沒有證書的情況下運行請求,並且無法準備其失敗(例如,帶有證書的重試),或者必須提前提供證書,然後才能發送第一個請求。奇怪的是,相同的HWR類和框架的其餘部分爲您提供了擴展點,使您能夠即時驗證服務器的證書。我不明白他們的願景。 – quetzalcoatl 2014-04-30 22:51:42

+1

我想在SslStream類中使用LocalCertificateSelectionCallback。但它並沒有在HttpWebRequest類中公開。 http://msdn.microsoft.com/en-us/library/system.net.security.localcertificateselectioncallback.aspx – justcoding124 2014-05-01 13:21:06

相關問題