我有一個服務設置爲從ADFS檢索安全令牌並使用該令牌與其他服務進行通信。當我從我本地開發機器上的ADFS windowsmixed端點聯繫ADFS服務時,我能夠成功地檢索令牌。然而,當我運行ADFS在同一臺機器上安裝我的服務,我收到以下錯誤:問題聯繫服務器上的ADFS端點
Secure channel cannot be opened because security negotiation with the remote endpoint has failed. This may be due to absent or incorrectly specified EndpointIdentity in the EndpointAddress used to create the channel. Please verify the EndpointIdentity specified or implied by the EndpointAddress correctly identifies the remote endpoint.
我能夠重現錯誤與下面的代碼只是獲取令牌。當我在我的開發機器上訪問遠程服務器時,此代碼仍然有效,但直接在服務器上失敗。我在兩者上使用相同的用戶憑據。我在IIS Web服務中使用應用程序池證書和使用下面的代碼的簡單測試客戶端獲得了相同的錯誤。
private static SecurityToken GetToken()
{
string stsEndpoint = "https://adfsserver.com/adfs/services/trust/13/windowsmixed";
string appliesTo = "http://domain.com/application/myapplication";
var factory = new WSTrustChannelFactory(
new WindowsWSTrustBinding(SecurityMode.TransportWithMessageCredential),
stsEndpoint);
factory.TrustVersion = TrustVersion.WSTrust13;
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointAddress(appliesTo),
KeyType = KeyTypes.Symmetric
};
var channel = factory.CreateChannel();
return channel.Issue(rst);
}
我打開了Windows事件日誌中的ADFS 2.0調試跟蹤。當直接在服務器上打開windows混合端點時,我沒有收到任何讓我相信它沒有真正進入端點的條目。
我在安全日誌中收到了很多與我正在運行的服務相關的審計失敗: 請求了對象的句柄。
Subject:
Security ID: DOMAIN\ODI$ODIController
Account Name: ODI$ODIController
Account Domain: DOMAIN
Logon ID: 0x1a574b5
Object:
Object Server: SC Manager
Object Type: SERVICE OBJECT
Object Name: WinHttpAutoProxySvc
Handle ID: 0x0
Process Information:
Process ID: 0x1f8
Process Name: C:\Windows\System32\services.exe
Access Request Information:
Transaction ID: {00000000-0000-0000-0000-000000000000}
Accesses: Query status of service
Start the service
Query information from service
Access Reasons: -
Access Mask: 0x94
Privileges Used for Access Check: -
我能夠訪問使用存儲憑據usernamemixed端點和接收正確的令牌,所以它似乎有什麼東西與認證用戶甚至能夠與ADFS端點通信。
如果我在上面的代碼中設置了特定的憑據,它就能夠連接。這再次讓我相信,在同一臺機器上,它不會爲我的Windows用戶傳遞正確的憑據。
factory.Credentials.Windows.ClientCredential = new System.Net.NetworkCredential("UserID", "password1", "dev.domain");
感謝您提供任何幫助。
Brian