2012-06-16 74 views
0

當我嘗試從運行在IIS Express上的Web應用程序連接到Intranet Web服務時,Web服務返回403 Forbidden。當我通過單元測試或在Cassini或我的服務器上的IIS 7.5下運行的同一站點訪問時,該服務正常工作。我的直覺告訴我這是一個配置問題,但我不確定從哪裏開始尋找。從IIS Express訪問遠程Web服務會導致403禁止

當從IIS Express上運行的站點訪問該服務時,什麼會導致遠程Web服務返回403 Forbidden?

澄清我訪問的服務不是基於SOAP的。我正在設置一個特定的網絡憑證,並將其與下面的代碼所示的請求一起傳遞。

protected XDocument Search(Uri requestUri) 
{ 
    var nc = new NetworkCredential(this.config.ServiceUserName, 
     this.config.ServicePassword); 
    var cCache = new CredentialCache(); 
    cCache.Add(requestUri, "Basic", nc); 

    var request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
    request.Credentials = cCache; 
    request.PreAuthenticate = true; 
    request.Method = WebRequestMethods.Http.Get; 

    var response = (HttpWebResponse)request.GetResponse(); 
    return XDocument.Load(new StreamReader(response.GetResponseStream())); 
} 
+0

從哪裏開始:您的cassini應用程序可能正在您的用戶標識下運行。另一方面,IIS Express可能使用不同的Windows身份運行。可能是IUSR(我不知道IIS Express)。遠程服務可能使用Windows身份驗證 - 並且不允許匿名訪問。因此,您需要在遠程服務器上的IIS vdir上爲IIS Express的身份(可能是machine \ IUSR,其中machine是運行IIS Express的計算機的名稱)授予權限。 – Cheeso

+0

@Cheeso我應該發佈代碼與我的問題。我正在提供身份驗證,因此我很困惑。 – ahsteele

回答

0

我沒有時間深入瞭解爲什麼現在,但我可以說它與我的代理設置有關。切換到我的盒子不同的代理提供商緩解了這個問題。這個內部事務應該一直繞過代理,爲什麼IIS的行爲與其他機制不同。抱歉,我打算將此標記爲答案,並希望小通知檢查您的代理設置有助於某人。對不起,這不是更具體。

0

在對Web服務的側窗驗證的情況下,你/將運行到問題的列表:

  • 作爲Cheeso指出你傳請求可以是簡單的匿名下運行(或本地)帳戶。這可能是由於沒有模擬呼叫用戶而運行,並且流程本身運行在錯誤的帳戶下,或者用戶被認爲是匿名的,並且請求被切換到特定的本地「匿名」帳戶。
  • 當您通過打開輸入用戶的模擬來解決上述問題時,您將遇到「NTLM一跳地獄」問題 - 傳入憑據無法在其他服務器上使用(Kerberos是一種解決方案,但不太可能在大多數情況下可用例)。
  • 當您通過禁用模擬(或在流程的帳戶而不是傳入用戶的帳戶下運行代碼)並使進程在域帳戶(或實際上具有Web服務權限的其他帳戶)下運行時修復第一個問題時,您將運行成爲事實,你可能會爲用戶打開獲取不應該訪問的數據的可能性。

本質上,您需要弄清楚哪些帳戶可以/應該訪問Web服務並運行代碼來加載該帳戶下的Web服務。該帳戶必須在本地登錄(不能使用傳入用戶的身份)。

+0

我試圖訪問的服務正在另一臺服務器上運行。我已經添加了代碼來顯示我如何訪問它。此代碼爲我希望驗證的用戶提供NetworkCredential。我不認爲模仿在提出請求時起作用(但我可能會誤解你的答案中的某些內容)。 – ahsteele

+0

我的答案與您的案例無關:它假定Windows身份驗證,但您的服務使用基於您的示例代碼的基本身份驗證。不,我不確定它爲什麼不起作用。 –

相關問題