.net core AuthenticationException WebAPI/ASP MVC dotnet Core

.net core AuthenticationException WebAPI/ASP MVC dotnet Core,.net-core,asp.net-core-webapi,.net Core,Asp.net Core Webapi,我有一个使用dotnet core的2个项目的解决方案 WebAPI项目->restapi MVC项目->连接到API以获取/发布值 我有一个核心库类,它有连接API的助手: public abstract class APIHelper { protected HttpClient ApiClient; public APIHelper() { InitializeClient(); }

我有一个使用dotnet core的2个项目的解决方案

WebAPI项目->restapi

MVC项目->连接到API以获取/发布值

我有一个核心库类,它有连接API的助手:

public abstract class APIHelper
    {
        protected HttpClient ApiClient;

        public APIHelper()
        {
            InitializeClient();
        }

        private void InitializeClient()
        {
            ApiClient = new HttpClient();
            //ApiClient.BaseAddress = new Uri("https://localhost:44333/api");
            ApiClient.BaseAddress = new Uri("https://localhost:5001/api");
            ApiClient.DefaultRequestHeaders.Accept.Clear();
            ApiClient.DefaultRequestHeaders.Accept
                .Add(new MediaTypeWithQualityHeaderValue("application/json"));
        }
    }
我有一个从该类继承并调用API的类:

public async Task<IEnumerable<Category>> Get()
{
    using (HttpResponseMessage response = await ApiClient.GetAsync("api/Category"))
    {
        if (response.IsSuccessStatusCode)
        {
            var readed = await response.Content.ReadAsStringAsync();
            var result = JsonConvert.DeserializeObject<IEnumerable<Category>>(readed);
            return result;
        }
        else
        {
            throw new Exception();
        }

    }
}
我尝试使用http而不是https,结果是一样的

我尝试使用不同的浏览器,但结果相同

我在Windows和Linux上试过,结果都一样

当我尝试使用Postman时,它会得到值,因此WebPI项目没有问题(我认为是这样)

我不知道该怎么办


干杯。

您的SSL证书似乎有问题,您可以绕过此错误,如下所示。我没有尝试您的代码,但在从HttpClient初始化新对象后添加以下代码时,它始终有效

// bypass bad SSL certificate errors
        ServicePointManager.ServerCertificateValidationCallback =
              delegate (object s, X509Certificate certificate,
                       X509Chain chain, SslPolicyErrors sslPolicyErrors)
              { return true; };
因此,您的API助手应该如下所示

public abstract class APIHelper
{
    protected HttpClient ApiClient;

    public APIHelper()
    {
        InitializeClient();
    }

    private void InitializeClient()
    {
        ApiClient = new HttpClient();
        // bypass bad ssl certificate errors
        ServicePointManager.ServerCertificateValidationCallback =
              delegate (object s, X509Certificate certificate,
                       X509Chain chain, SslPolicyErrors sslPolicyErrors)
              { return true; };
        //ApiClient.BaseAddress = new Uri("https://localhost:44333/api");
        ApiClient.BaseAddress = new Uri("https://localhost:5001/api");
        ApiClient.DefaultRequestHeaders.Accept.Clear();
        ApiClient.DefaultRequestHeaders.Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
}

当您使用visual studio进行调试时,它使用iisexpress作为默认启动选项,并为iisexpress配置了端口和SSL证书

然后,Iisexpress将根据您使用的dotnet版本和web.config中的配置,与dotnet应用程序进行对话,可以是进程中的,也可以是反向代理

当您使用dotnetrun运行它时,它使用kestrel,您需要在代码中设置端口、SSL证书和所有内容。检查program.cs和startup.cs文件中的代码


其中一个应用程序应该调用usekestrel,该应用程序具有可配置的kestrel附加选项。

您是否可以尝试使用RestSharp客户端连接到API,并从该链接查看如何使用它()你能试着执行这个命令吗?'dotnet dev certs https--trust'?根据这个链接:我用了这个,它工作了,我用了这个,这对你没有帮助。你需要用这个。也可以在这里查看GitHub问题,了解更多背景和信息
public abstract class APIHelper
{
    protected HttpClient ApiClient;

    public APIHelper()
    {
        InitializeClient();
    }

    private void InitializeClient()
    {
        ApiClient = new HttpClient();
        // bypass bad ssl certificate errors
        ServicePointManager.ServerCertificateValidationCallback =
              delegate (object s, X509Certificate certificate,
                       X509Chain chain, SslPolicyErrors sslPolicyErrors)
              { return true; };
        //ApiClient.BaseAddress = new Uri("https://localhost:44333/api");
        ApiClient.BaseAddress = new Uri("https://localhost:5001/api");
        ApiClient.DefaultRequestHeaders.Accept.Clear();
        ApiClient.DefaultRequestHeaders.Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
}