2012-07-19 44 views
1

我已經構建了一個ASP.NET MVC 4網站,它具有ASP.NET Web Api,它將通過IIS中的Windows身份驗證進行保護。在Visual Studio中工作正常; HttpClient的調用正在工作,並始終返回數據以及狀態碼200.但是,當我發佈到IIS時,這就是出錯的地方;當試圖打電話給api時,我總是得到一個401未經授權的這些設置:HttpClient通過Windows憑據

身份驗證:僅Windows身份驗證 授權:只允許一個用戶 - 我。

但是,當我將授權更改爲允許所有,它工作正常,但這不是我想要的行爲。

我試着直接從瀏覽器調用API,授權只設置爲我的帳戶......並且它可以正常工作,就像一個很好的小Api;除非我以其他用戶身份登錄,否則不會有未授權的錯誤

所以我想這導致我得出結論說,網站如何與API進行通信有些問題。這裏是我的代碼爲:

public ActionResult Index() 
{ 
    HttpClientHandler handler = new HttpClientHandler(); 
    handler.UseDefaultCredentials = true; 

    using (HttpClient client = new HttpClient(handler)) 
    { 
     var clientResult = client.GetAsync(
     string.Format(@"{0}{1}",ConfigurationManager.AppSettings["WebApiBaseUri"].ToString(), "products") 
     ).Result; 
     clientResult.EnsureSuccessStatusCode(); 
     //if (clientResult.StatusCode != HttpStatusCode.OK) 
     //{ 
     // ViewBag.Error = clientResult.StatusCode; 
     // ViewBag.User = userName; 
     // ViewBag.Message = clientResult.Content.ReadAsStringAsync().Result; 
     // return View(); 
     //} 

     var receivedData = clientResult.Content.ReadAsStringAsync().Result; 
     List<ProductModel> data = JsonConvert.DeserializeObject<List<ProductModel>>(receivedData); 
     return View(data); 
    } 
} 

,這裏是在API端的代碼:

public IQueryable<Product> Get() 
{ 
    _context = new InventoryContext(); 
    return _context.Products.AsQueryable(); 
} 

任何人都知道我做錯了嗎?

回答

0

問題是,您假設運行HttpClient請求的IIS進程將通過向網站發出請求的用戶的憑據發送。這是不正確的,除非你設置Kerberos來傳遞證書。相反,默認憑據將通過IIS中的應用程序池設置爲在其下運行的用戶的憑據發送。在另一個問題中,有關此問題的更詳細的答案,以及關於如何使用Kerberos的一些說明:ASP.NET passing along Windows Authentication credentials。如果您將您的IIS進程運行的帳戶添加到您的授權列表中,您應該看到您的調用成功,但我猜測這不是您想要的方式。