程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF分布式開發常見錯誤(22)

WCF分布式開發常見錯誤(22)

編輯:關於.NET

WCF分布式開發常見錯誤(22):The caller was not authenticated...如何在XP系統為WCF設置可信任的證書

我在XP 專業版系統進行WCF安全編程的時候,遇到的錯誤。使用的安全驗證 方式是: UserName and Password Security 綁定協議:.WSHTTPBinding。我 會把如何在XP環境下設置可信證書的過程,詳細的描述出來。因為這個錯誤就是 和證書有直接關系,對於很多XP環境下進行WCF編程的學習者來說,應該有不錯 的參考價值。錯誤信息:The caller was not authenticated by the service 。服務驗證調用者失敗。XP系統配置證書還似乎比較麻煩,你像Windows服務器 系列,我們可以建立CA來控制證書的狀態。雖然我們可以自己安裝。但是過於麻 煩。正如申請一個免費的證書一樣。僅僅為了個人學習,一切都希望簡單,快速 地學習WCF的安全編程。我這裡也是使用了makecert制作的證書。

設置了服務器證書,消息安全模式。  我搜索的資料。如下:

The caller was not authenticated by the service - WCF Security using ...

The caller was not authenticated by the service

Caller was not authenticated by the service

WCF - The caller was not authenticated by the service

WCF - TCP+Cert "The caller was not authenticated by the service." 但是沒什麼幫助,類似的問題很多都是沒有解決。問題我也放到WCF中文和英文 論壇:

http://social.microsoft.com/Forums/zh-CN/wcfzhchs/thread/cd3f0247- a1b4-43c0-af1c-7b0e609b1e3b

http://social.microsoft.com/Forums/zh-CN/wcf/thread/3a5417c6-fdd1- 47d7-9757-ebc8ede7affb。

【1】問題描述:錯誤信息的截圖:

一樣采用UserNamePasswordValidator驗證方式。wsHttpBinding,此綁定支 持WS安全規范。必須啟動服務端證書。 WCF分布式開發常見錯誤(21):unable to open its IChannelListener.分發器未能打開偵聽器 ,已經遇到過一次了問題。 當時導致錯誤的原因是沒有啟用服務端證書。 這個錯誤修正完畢以後,再次啟 動服務,添加服務引用,生成了客戶端代理等相關文件。  服務行為的證書配 置信息如下:

<serviceBehaviors>
         <behavior name="WCFService.WCFServiceBehavior">
           <serviceMetadata httpGetEnabled="true" />
           <serviceDebug includeExceptionDetailInFaults="false" />
           <serviceCredentials>
             <serviceCertificate  x509FindType="FindBySubjectName"  findValue="MyServer" storeLocation="CurrentUser"/>
             <clientCertificate >
               <authentication certificateValidationMode="None" />
             </clientCertificate>
             <userNameAuthentication userNamePasswordValidationMode="Custom"      customUserNamePasswordValidatorType="WCFService.MyUserNamePasswordVali dator,WCFService" />
           </serviceCredentials>
         </behavior>
       </serviceBehaviors>

這句話就是服務端查詢證書的依據:<serviceCertificate  x509FindType="FindBySubjectName" findValue="MyServer" storeLocation="CurrentUser"/>。在CurrentUser位置,查找主題為 MyServer的證書。

使用x509證書是符合WS安全規范。證書是非對稱加密算法的典型應用。至於 如何獲得非對稱加密、證書,我在之前的系列文章裡已經詳細講過,需要的話可 以再參考:WSE3.0構建Web服務安全(2):非對稱加密、公鑰、密鑰、證書、簽名 的區別和聯系以及X.509 證書的獲得和管理

【2】問題分析:

從異常信息來看:The caller was not authenticated by the service。服 務驗證調用者失敗。在看看驗證的代碼:

if (userName != "FrankXuLei" || password !=  "12345678")
             {
                 Console.WriteLine ("UserNamePasswordValidatation is sucessfully !:{0}",  userName);
                 //throw new  SecurityTokenException("Unknown Username or Password"); 
             }
             else
             {
                 Console.WriteLine ("UserNamePasswordValidatation is failed !:{0}", userName);
             }

猜測一下可能的原因:

(1)UserName 錯誤,這裡用戶名不等於FrankXuLei,也會導致驗證失敗。

(2)Password錯誤,這裡密碼不等於12345678,同樣也會導致驗證失敗。

(3)加密和解密出現了問題,這個是可能的原因,雖然我們使用了證書,難說 不會出現錯誤。比如使用了錯誤的服務端公鑰加密。

(4)其它原因,這個原因很難想到,居然是證書未受信任導致的。 這個原因 比較詭異。我也是幾乎崩潰的時候才想到的。查詢了很多資料,基本都對不上, 國內的技術文章基本都是直接貼代碼,然後是一對分析,至於能不能執行就另外 來說了。我相信很多自學WCF編程的朋友,也會遇到這個問題。   

【3】解決辦法:

你然找到的問題的原因,就想辦法來解決。下面的步驟就是如何使的自己制 作的服務器證書編程可信任。

(1)制作證書:這裡直接使用makecert 工具。Microsoft Visual Studio 2008-->Visual Studio Tools-->Visual Studio 2008 命令提示行裡輸入 :

makecert -r -pe -n "CN=FrankWCFServer" -ss My -sky exchange

具體大家可以看文章WSE3.0構建Web服務安全(2):非對稱加密、公鑰、密鑰、 證書、簽名的區別和聯系以及X.509 證書的獲得和管理,詳細的介紹。具體的參 數說明:詳細幫助文檔: http://msdn.microsoft.com/library/chs/default.asp? url=/library/CHS/cptools/html/cpgrfcertificatecreationtoolmakecertexe. asp

(2)導出證書:

這裡要借助IE浏覽器,此例以IE7為准,其它版本功能類似,可能界面有差異 。具體步驟:

打開浏覽器---->Internet 選項----->內容----->證書-----> 個人,你會看到剛才制作的證書。如圖:

選擇導出,保存為一個證書

這裡是不包含私鑰的二進制X.509證書文件。

(3)導入證書:

使用向導,在受信任的根證書機構裡導入證書:

(4)測試證書:

此時剛才創建的FrankWCFServer證書,就可以使用了,我們啟動WCF服務宿主 ,運行客戶端,設置用戶名和密碼以後,調用方法成功!解決了上訴問題。

【4】總結:

WCF安全編程相對來多復雜了很多。WCF提升了安全級別。在WCF分布式開發常 見錯誤(21):unable to open its IChannelListener.分發器未能打開偵聽器最 後和Robin Zhang 還有 不若相忘於江湖 討論過這個問題。

我之前也有關於這個問題的疑惑。因為之前Web Service 和 WSE3.0 裡都可 以使用用戶名和密碼方式來實現身份驗證。Web Service可以直接在Soap 消息頭 部加入UserName 和Password信息。WSE3.0對此進行了擴展,加入了安全驗證機 制,要求客戶端在服務調用以前,必須設置用戶令牌信息,服務獲取請求以後, 先進行消息的還原和驗證。WCF裡的UserNamePasswordValidator驗證方式應該就 是對擴展。不過他是重寫了UsernameTokenManager的AuthenticateToken方法。 但是機制應該類似。大家有興趣可以看看WSE3.0構建Web服務安全(1):WSE3.0安 全機制與實例開發 。

希望這個文章對希望簡化Xp下WCF安全編程的朋友一些幫助。正在整理WCF安 全的文章。代碼也已經調試完畢。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved