我在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
{
}
答案 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
}
}
}