HttpClient传递在Windows凭据中

时间:2012-07-19 08:48:56

标签: asp.net-mvc authentication asp.net-web-api httpclient

我已经构建了一个带有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();
}

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

问题是您假设运行HttpClient请求的IIS进程将通过向网站发出请求的用户的凭据发送。除非您设置Kerberos以传递凭据,否则这不是真的。相反,默认凭据将通过IIS中的应用程序池设置为在其下运行的用户凭据发送。在另一个问题中,这个问题的答案要详细得多,还有一些关于如何使用Kerberos的指示:ASP.NET passing along Windows Authentication credentials。如果您将IIS进程正在运行的帐户添加到您的授权列表中,您应该会看到您的呼叫成功,但我猜测这并不是您希望如何运作。