HttpClient错误从另一个webapi调用webapi

时间:2018-03-20 11:30:47

标签: asp.net-web-api2 openid-connect

enter image description here我在asp.net core 2.0中开发了两个webapi,并使用identityserver4框架进行保护。这两个api都启用了ssl

我正在使用angular2应用程序访问webapi。

当我从角度应用程序中单独访问webapi时,一切正常。但是当我尝试从一个webapi访问另一个webapi时,我正在

System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.Http.WinHttpException: A security error occurred

以下是我在其中一个webapi中使用的代码:

       var request = CurrentContext.Request;
        var authHeader = request.Headers["Authorization"];
        var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

        var client = new System.Net.Http.HttpClient
        {
            BaseAddress = new Uri($"https://localhost:5001/")
        };

        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = authHeaderVal;


        var response = await client.GetAsync("api/alerts/1");
        if(response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
        }
        else
        {

        }

2 个答案:

答案 0 :(得分:1)

它接近 CORS 问题。

CORS 代表跨源资源共享。 顾名思义,您试图从不同的来源访问资源,它可能是一个不同的域,协议或端口。

CORS 您的浏览器会在未启用 CORS 的服务器上强制执行请求,请检查MS docs如何启用 CORS 关于你的api。

CORS 规则并非必须强制执行,但大多数浏览器会针对安全问题强制执行该规则,因此一些开发人员工具(如PostMan)会忽略它以使开发更容易。

另一种解决方案是在浏览器中安装一个插件,以便在您使用Chrome时禁用this extension等限制。

答案 1 :(得分:0)

由于您在localhost上运行,因此很可能您未通过SSL验证。您可以覆盖验证。此外,HttpClient应该是静态的,因此您应该相应地更新代码。

var request = CurrentContext.Request;
var authHeader = request.Headers["Authorization"];
var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);

using (var httpClientHandler = new HttpClientHandler())
{
    httpClientHandler.ServerCertificateCustomValidationCallback = (msg, cert, chain, err) => { return true; };
    using (var client = new HttpClient(httpClientHandler)
        {
            BaseAddress = new Uri($"https://localhost:5001/")
        })
    {
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        client.DefaultRequestHeaders.Authorization = authHeaderVal;


        var response = await client.GetAsync("api/alerts/1");
        if(response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
        }
        else
        {
            //do something
        }
    }
}