首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 分散式開發常見錯誤 (22):XP 系統下「呼叫者未通過驗證」與服務憑信任憑證配置

     編輯:關於.NET

錯誤背景

在 Windows XP 專業版環境下,使用 WSHttpBinding 搭配 Message 安全模式與 UserName 客戶端認證時,雖已配置服務端憑證與自訂 UserNamePasswordValidator,仍遭遇異常:

The caller was not authenticated by the service.

服務端驗證邏輯正確,帳密比對無誤,但通訊仍失敗。

根本原因

WCF Message 安全模式要求服務端憑證必須被客戶端信任。XP 非網域環境下,自我簽署憑證預設不受信任,導致訊息層安全交換階段即失敗,根本未進入使用者名稱驗證邏輯。

解決方案:將自我簽署憑證加入「受信任的根憑證授權單位」

1. 建立憑證

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

2. 匯出公開金鑰憑證 (.cer)

  1. 開啟 IE → 「網際網路選項」 → 「內容」 → 「憑證」 → 「個人」
  2. 找到 FrankWCFServer,點選「匯出」
  3. 選擇「否,不匯出私鑰」 → 格式選「DER 編碼二進位 X.509 (.CER)」 → 存檔

憑證匯出步驟

匯出格式選擇

3. 匯入至「受信任的根憑證授權單位」

  1. 執行 mmc.exe → 「檔案」 → 「新增/移除嵌入式管理單元」 → 加入「憑證」 → 選「電腦帳戶」 → 「本機電腦」
  2. 展開「受信任的根憑證授權單位」 → 「憑證」 → 右鍵「所有工作」 → 「匯入」 → 選取剛匯出的 .cer 檔
  3. 完成後,該憑即受系統信任

匯入受信任根憑證授權單位

4. 驗證

重新啟動服務宿主與客戶端,輸入正確帳密,呼叫成功。

服務端關鍵配置片段

<serviceCredentials>
  <serviceCertificate x509FindType="FindBySubjectName" findValue="MyServer" storeLocation="CurrentUser"/>
  <clientCertificate>
    <authentication certificateValidationMode="None"/>
  </clientCertificate>
  <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFService.MyUserNamePasswordValidator,WCFService"/>
</serviceCredentials>

總結

XP 工作群組環境下開發 WCF Message 安全服務,服務端憑證必須被客戶端機器信任。將自我簽署憑證匯入「受信任的根憑證授權單位」是最快捷的解決路徑,避免架設 CA 或購買商業憑證,適合學習與測試階段。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved