我已经构建了一个带有ASP.NET Web Api的ASP.NET MVC 4网站,该网站将通过IIS中的Windows身份验证进行保护。在Visual Studio中,工作正常; HttpClient的调用正在工作,并始终返回数据以及状态代码200.但是,当我发布到IIS时,那就是出错的地方;当试图打电话给api时,我总是通过以下设置获得401 Unauthorized:
身份验证:仅限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 :(得分:0)
问题是您假设运行HttpClient请求的IIS进程将通过向网站发出请求的用户的凭据发送。除非您设置Kerberos以传递凭据,否则这不是真的。相反,默认凭据将通过IIS中的应用程序池设置为在其下运行的用户凭据发送。在另一个问题中,这个问题的答案要详细得多,还有一些关于如何使用Kerberos的指示:ASP.NET passing along Windows Authentication credentials。如果您将IIS进程正在运行的帐户添加到您的授权列表中,您应该会看到您的呼叫成功,但我猜测这并不是您希望如何运作。