2013-05-13 142 views
0

我一直在旋轉我的車輪幾天現在沒有取得任何進展,我迄今爲止在網上發現的建議還沒有完全實現,所以在這裏:Visual Studio 2012 + 403.7錯誤

  1. 我有一個WCF服務,它連接到...不知道什麼類型的Web服務,你會在另一端調用這種類型的REST-ISH。該方法的URL如下所示:「https://partner.someservice.com/SomeMethod.asp」。我將一些查詢字符串參數塞入到結尾,並將請求發送到它們的服務器。

  2. VS中的錯誤只顯示403,但是當我使用Fiddler時,我看到了403.7。在將證書導入瀏覽器之前,我也看到了403.7。我可以檢查我的請求對象,並看到指定了[1] cert的ClientCertificates,所以我很確定它已被連接。

  3. 我已將.pfx文件導入我的機器和本地用戶證書商店。我以許多方式多次運行winhttpcertcfg實用程序,基本上遵循了我在MSDN和SO帖子中看到的說明。

    winhttpcertcfg -g -c LOCAL_MACHINE \ MY -s [證書] -a [用戶/ ASPNET/auth'd用戶]

    winhttpcertcfg.exe -i [cert.pfx] -c LOCAL_MACHINE \ MY -p [pwd]

  4. 我已將.pfx文件導入Chrome。如果我在Chrome中打開該網址,我會提示選擇我的證書,然後我可以繼續訪問該網址。在IE中有相同的行爲。

所以這似乎是專門針對我在VS運行,雖然我不知道我沒有檢查什麼選項,或者什麼允許,我還沒有批准。在我的WCF服務的項目屬性下,我嘗試了「使用Visual Studio開發服務器」和「使用本地IIS Web服務器」,但是從每個服務器獲得相同的行爲。我錯過了什麼?

一些代碼:

private static string DoPost(string postData) 
    { 
     string result = null; 

     var httpWebRequest = (HttpWebRequest)WebRequest.Create(GetEndpoint()); 
     var encoding = new ASCIIEncoding(); 
     var bytes = encoding.GetBytes(postData); 

     httpWebRequest.Method = "POST"; 
     httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     httpWebRequest.ContentLength = bytes.Length; 
     httpWebRequest.ClientCertificates.Add(clientCertificate); 

     using (var stream = httpWebRequest.GetRequestStream()) 
     { 
      stream.Write(bytes, 0, bytes.Length); 
      stream.Close(); 

      using (var httpWebResponse = httpWebRequest.GetResponse()) 
      using (var responseStream = httpWebResponse.GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (var reader = new StreamReader(responseStream)) 
        { 
         result = reader.ReadToEnd(); 
        } 
       } 
      } 
     } 

     return result; 
    } 

和代碼獲得證書(由其他開發人員編寫的實用工具類,這似乎工作在生產就好了):

public static X509Certificate2 GetCertificateBySerial(string serial) 
    { 
     var store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
     store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); 

     var certColl = store.Certificates.Find(X509FindType.FindBySerialNumber, serial, false); 
     store.Close(); 

     if (certColl.Count == 0) 
     { 
      throw new Exception(String.Format("A certificate with a serial number of \"{0}\" is not installed on the server.", serial)); 
     } 
     return certColl[0]; 
    } 
+0

我會嘗試將證書添加到受信任的根證書頒發機構存儲中。我認爲,只要瀏覽器在瀏覽URL時提示您輸入任何內容,您的代碼將無法直接連接。 – 2013-05-13 16:44:36

+0

感謝您的建議。我嘗試將它導入本地計算機和當前用戶可信根證書頒發機構,但都沒有任何效果。 – 2013-05-13 16:50:44

+0

嗯 - 我明白了。您可能已經看到了這一點,但[本頁]上的評論(http://support.microsoft.com/kb/186812)表明它實際上是服務器上的問題。 – 2013-05-13 17:08:03

回答

0

我做幾個變化,並能夠得到這個工作。首先,我必須從GET更改爲POST *,並且這樣做時我意外地在發佈數據(oops)中留下了一部分端點/ URL。其次,我在HttpWebRequest的包括在此:

httpWebRequest.ProtocolVersion = HttpVersion.Version11; 

而在去年的403.7錯誤實際上是由小提琴手攔截引起我的流量。我沒有在Fiddler中正確配置此證書,但接下來會出現。一旦我關閉了Fiddler並且正確地格式化了我的POST數據,事情就解決了。

*從GET切換到POST與解決這個問題無關,只是一些故事。

TL; DR我沒有正確格式化我的請求。