2010-04-03 99 views

回答

1

雖然這不是正確的方法,但tt在理論上可以按照您描述的方式使用表單身份驗證。這可以通過以下任一方式完成:

  1. 使用WebRequest以原始形式將請求發送到Web服務。這將涉及檢查響應,提取相關的表單 - 認證字段,併發迴響應以記錄用戶進入。這將生成一個cookie,您必須將其隨後的每個響應發送到服務
  2. 生成FormsAuhentication身份驗證自己動手。這很複雜,因爲它涉及在調用應用程序上同步機器密鑰,並且人爲地操縱發送到託管服務的機器的標題。
  3. 在需要與Web服務交互的會話開始時顯示用於登錄的表單身份驗證表單。然後,您可以收集生成的cookie,並按照選項(2)將其呈現給HTTP標頭中的服務。

正如您所看到的,這些方法非常複雜,並且從根本上來說是一種使用表單驗證的手段,因爲它從來沒有打算過。

Microsoft希望我們使用Windows身份驗證或SSL證書來保護對ASP.NET Web服務的訪問。請參閱MSDN上的HTTP Security and ASP.NET Web Services

如果您能夠使用WCF,那麼還有其他幾個選項,包括在SOAP中構建自定義身份驗證機制的能力,以及WCF的一些支持。

絕大多數情況下,保護Web服務是工作中最棘手的部分之一。我所看到的許多現場解決方案都是妥協,比如上面的解決方案。

0

看來答案是否定的。表單身份驗證是一種基於cookie的機制,並且您的WinForms應用程序將無法保存和轉發cookie(如果有的話,無需一些嚴重的解決方法)。

在研究您的問題時,我寫下了一個潛在的解決方法,試圖使用NetworkCredential對象,但這並不奏效。還嘗試過.NET 4.0中的ClientCredentials

var ss = new MySecureWebService.MyServiceSoapClient(); 
ss.ClientCredentials.UserName.UserName = "abc"; 
ss.ClientCredentials.UserName.Password = "123"; 
string asmxReturn = ss.HelloWorld(); //exception returned here 

調用webmethod時,控制檯應用程序仍顯示登錄html頁面。

其他建議

  • 如果你有源到Web服務,從提取它的邏輯放到了自己的組件。在WinForms應用程序中引用該程序集,就像調用Web服務一樣。

我知道您的目標是重用已部署的應用程序,但下一個最好的做法是使用通過.dll參考的相同邏輯/實現。

相關問題