2012-07-19 83 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进程运行的帐户添加到您的授权列表中,您应该看到您的调用成功,但我猜测这不是您想要的方式。