我在客戶端電腦上使用一個桌面應用程式與服務器上運行的IIS WCF Web服務進行通信,使用WsHttpBinding來傳遞Windows用戶憑證。該應用程式多年來一直運行良好,但現在我們正試圖讓它通過 HTTPS 進行通信,而不僅僅是 HTTP。
在服務器端,我們為IIS網站添加了一個SSL證書,并更改WCF web.config,以便為系結定義使用Transport安全:
<wsHttpBinding>/span>
<binding name="WSHttpBinding_IService1"/span>>
<readerQuotas maxArrayLength="2147483647"/span> />
<security mode="Transport" />
</binding>
</wsHttpBinding>/span>
在客戶端,用于連接服務的客戶端物件使用Transport安全模式,以說明HTTPS通信模式:
Dim serverURL as String = ReadServerURL()
Dim client As Service1Client
Dim binding As Channels.Binding
Dim dcso As ServiceModel.Description.DataContractSerializerOperationBehavior
binding = New WSHttpBinding("WSHttpBinding_IService1"/span>)
If serverURL.ToLower.StartsWith("https://") Then
CType(binding, WSHttpBinding).Security.Mode = SecurityMode.Transport
Else
CType(binding, WSHttpBinding).Security.Mode = SecurityMode.Message
End If
CType(binding, WSHttpBinding).Security.Message.ClientCredentialType = MessageCredentialType.Windows
CType(binding, WSHttpBinding).Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows
binding.ReceiveTimeout = New TimeSpan(0, 10, 0)
client = New Service1Client(binding, New EndpointAddress(serverURL))
client.ClientCredentials.Windows.ClientCredential = CType(CredentialCache.DefaultCredentials, NetworkCredential)
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Delegation
有些客戶使用 Kerberos 將 Windows 憑證傳遞給另一臺服務器,這就是我們使用 Delegation 的原因。
大多數客戶選擇了使用自簽名證書,因為他們只使用內部服務器。
在IIS中,WCF站點啟用了Windows認證,并啟用了Negotiate和NTLM提供者。
這種方法似乎在大多數客戶的網站上運行良好,但至少有一個網站遇到了這樣的錯誤:
HTTP請求是一個很重要的問題,因為它是一個很重要的問題。
HTTP 請求未經授權,客戶認證方案為 "協商"。從服務器收到的認證頭是'Negotiate oXlwcKADCgEBomkEZ2....oZSQ='。 我不確定IIS中這個備用的'Negotiate oXlwcK...'提供者來自哪里,也不確定如何配置客戶端與它正確通信。這是一個IIS配置問題,還是WCF服務代碼和/或客戶端應用代碼的問題,或者是一個網路/域名問題?如果有任何幫助,我們將不勝感激。
uj5u.com熱心網友回復: 如果你看到這個問題,呼叫同一臺機器上的WCF服務,你可能需要填充BackConnectionHostNames注冊表鍵。
在regedit中,找到并點擊以下注冊表子鍵:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaMSV1_0 右鍵單擊 MSV1_0,指向新建,然后單擊多字串值。
在名稱欄中,輸入 BackConnectionHostNames,然后按 ENTER 鍵。
右鍵單擊 BackConnectionHostNames,然后單擊 Modify。在值資料框中,鍵入CNAME或DNS別名,它用于計算機上的本地共享,然后單擊確定。
在一個單獨的行中輸入每個主機名稱。
請參閱呼叫與客戶端在同一臺機器上托管在 IIS 中的 WCF 服務會出現驗證錯誤,以了解詳情。 uj5u.com熱心網友回復: 我通過在 對于 這只在.NET Framework上起作用,但在.NET Core 3.1中不起作用(我沒有嘗試.NET Core 5.0)。
標籤: 上一篇:我如何將ReactNative模板轉換為專案并運行它?
下一篇:改變WCF信封請求的前綴命名空間
EndpointAddress建構式中添加一個UpnEndpointIdentity物件來解決這個問題。
UpnEndpointIdentity中的引數,我不得不使用顯示在IIS應用池 "身份 "欄中的用戶名。例如:var id = new UpnEndpointIdentity("DOMAINuser.name");

