2010-09-14 117 views
1

我試圖連接到使用Kerberos身份驗證來授權用戶的Web服務,但我每次嘗試發出請求時都會收到401未授權的問題。以下是我正在使用的代碼。預先感謝您提供的任何幫助!使用Kerberos身份驗證的ASP.NET HttpWebRequest

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.Credentials = CredentialCache.DefaultCredentials; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

編輯:我覺得我應該多解釋一下我試圖做的事情。我一直負責爲我公司的Google Search Appliance提供新界面。我使用的是一個ASP.NET頁面,它執行一些操作,例如根據用戶所在的位置選擇一個集合等,然後將適當的搜索字符串發送給GSA。這一切都運行良好,直到他們決定開啓認證爲止,現在我無法得到任何結果(我要麼獲得401未經授權的消息,要麼聲明'根級數據無效')。如果我將搜索字符串並直接提供給GSA,它認證正確,並顯示結果,我似乎無法通過HttpWebRequest獲取它。

編輯2:我看了一些(通過Fiddler運行請求),它看起來像請求只是試圖協商而不是Kerberos。我設置了證書使用Kerberos明確如下,但它並沒有幫助...

public XPathNavigator GSASearch(string url, string searchString) 
    { 
     CredentialCache credCache = new CredentialCache(); 
     credCache.Add(new Uri(url), "Kerberos", CredentialCache.DefaultNetworkCredentials); 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + searchString); 
     request.CookieContainer = new CookieContainer(); 
     request.PreAuthenticate = true; 
     request.Credentials = credCache; 
     request.ContentType = "text/xml"; 
     request.Method = "POST"; 

     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     Stream receiveStream = response.GetResponseStream(); 

     //StreamReader readStream = new StreamReader(receiveStream); 

     XPathDocument doc = new XPathDocument(receiveStream); 
     return doc.CreateNavigator(); 
    } 

編輯3:好了,再仔細一看,該CredentialCache.DefaultCredentials不會出現在我的網絡憑據它...

+0

你還沒有提到你在哪裏運行你的客戶端。它是一個控制檯應用程序,aspx應用程序等? – feroze 2010-09-15 01:23:29

+0

對不起...這是一個aspx應用程序 – 2010-09-15 12:53:18

+0

我猜你沒有正確的Active Directory設置......需要在兩臺服務器之間設置一些信任設置 – 2011-06-17 16:45:14

回答

0

1)您是否使用瀏覽器完成了GSA成功會話的wireshark跟蹤?那樣有用嗎?

2)如果#1有效,那麼GSA在第一個未經身份驗證的請求上發送的WWW-Authenticate標頭是什麼?

3)ASPX應用程序運行的機器是GSA所在AD域的一部分嗎? AFAIK這可能需要一個成功的身份驗證。

4)接下來,由於它是執行請求的ASPX應用程序,因此您無法使用DefaultCredentials,因爲您實際上需要GSA信任的用戶的憑據。爲此,您應該爲正在與GSA通話的應用程序創建一個特殊用戶帳戶,或者讓每個用戶成爲GSA上的受信任用戶,並讓ASPX頁面首先對用戶進行身份驗證,然後使用授權將這些憑據傳遞給GDA 。爲此,您還必須讓服務器運行受信任委派的ASPX應用程序。

在我看來,你應該首先將你的代碼建模到你運行的控制檯應用程序中,然後進行調試。然後將其移植到ASPX頁面。這樣你就能知道失敗是由於主機(ASPX vs console)還是別的。

+0

好吧,剛剛發現一個新的打嗝時嘗試步驟1與提琴手...它需要連接到https://鏈接,而不是http://。我嘗試將我的連接網址更改爲https://但它確實沒有什麼區別(實際上,https:// url仍可與未經身份驗證的GSA通話一起使用,所以我真的懷疑這是問題所在)。不知道這是否會影響您提供的其他步驟。 – 2010-09-16 13:51:19

+0

使用小提琴手時,當我直接從GSA嘗試成功時,在標題信息中看不到任何WWW-Authenticate。 – 2010-09-16 13:57:36

+0

在#3上,是的,它們位於同一個域中。 – 2010-09-16 13:58:05