AuthenticationException. Asp.net Core.

0

W zaznaczonym komentarzem miejscu pojawia się następujący wyjątek: AuthenticationException: The remote certificate is invalid because of errors in the certificate chain: UntrustedRoot. Będę wdzięczny za pomoc w rozwiązaniu tego problemu.

 public async Task<T> SendAsync<T>(ApiRequest apiRequest)
        {
            try
            {
                var client = httpClient.CreateClient("MangoAPI");
                HttpRequestMessage message = new HttpRequestMessage();
                //I have set Accept header to "application/json" which tells the Server to send the data into JSON format
                message.Headers.Add("Accept", "application/json"); 
                message.RequestUri = new Uri(apiRequest.Url);
                client.DefaultRequestHeaders.Clear();

                if(apiRequest.Data != null)
                {
                    message.Content = new StringContent(JsonConvert.SerializeObject(apiRequest.Data));
                }

                HttpResponseMessage apiResponse = null;

                switch(apiRequest.ApiType)
                {
                    case SD.ApiType.POST:
                        message.Method = HttpMethod.Post;
                        break;
                    case SD.ApiType.PUT:
                        message.Method = HttpMethod.Put;
                        break;
                    case SD.ApiType.DELETE:
                        message.Method = HttpMethod.Delete;
                        break;
                    default:
                        message.Method = HttpMethod.Get;
                        break;
                }

                apiResponse = await client.SendAsync(message);          //tutaj pojawia się AuthenticationException
                var apiContent = await apiResponse.Content.ReadAsStringAsync();
                var apiResponseDto = JsonConvert.DeserializeObject<T>(apiContent);
                return apiResponseDto;

            }
            catch(Exception e)
            {
                var dto = new ResponseDto() 
                {
                    DisplayMessage = "Error",
                    ErrorMessages = new List<string> { Convert.ToString(e.Message) },
                    IsSuccess = false
                };

                var res = JsonConvert.SerializeObject(dto);
                var apiResponseDto = JsonConvert.DeserializeObject<T>(res);
                return apiResponseDto;
            }
        }
        ```
2

No błąd dość konkretnie mówi co się stało :P

Certyfikat zwracany przez serwer pod adresem apiRequest.Url jest wystawiony przez CA, któremu nie ufasz na maszynie na której uruchamiasz kod.
Sprawdź jaki jest zwracany certyfikat z tamtego serwera i albo mu zaufaj, albo wyłącz weryfikowanie certyfikatu serwera w opcjach HttpClienta.

0

Nie mogę znalezc takiej opcji we właściwościach HttpClienta. Co mam dokładnie wybrać i napisać?

0
some_ONE napisał(a):

No błąd dość konkretnie mówi co się stało :P

Certyfikat zwracany przez serwer pod adresem apiRequest.Url jest wystawiony przez CA, któremu nie ufasz na maszynie na której uruchamiasz kod.
Sprawdź jaki jest zwracany certyfikat z tamtego serwera i albo mu zaufaj, albo wyłącz weryfikowanie certyfikatu serwera w opcjach HttpClienta.

I jeszcze jedno mam pytanie. W jaki sposób ta funkcja zwróciła dane z bazy danych skoro nie ma tam żadnych zapytań do bazy?

    public async Task<T> GetProductAsync<T>()
    {
        return await this.SendAsync<T>(new ApiRequest() {
            ApiType = SD.ApiType.GET,
            Url = SD.ProductAPIBase + "api/products",
            AccessToken = ""
        });
    }

To chyba z tego Url bierze dane, czyli wywołuje daną akcję.
0
MrKluska1111 napisał(a):

Nie mogę znalezc takiej opcji we właściwościach HttpClienta. Co mam dokładnie wybrać i napisać?

var handler = new HttpClientHandler();
handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, certChain, policyErrors) => true;

var client = new HttpClient(handler);

Widzę, że klienta tworzysz przez IHttpClientFactory z .NET Core to musisz znaleźć jak tam się konfigurowało handler przy rejestracji klienta. Z głowy nie pamiętam, ale da się na pewno bo robiłem podobne rzeczy.

0

To będzie chyba to. Co nie?

services.AddHttpClient(Options.DefaultName, c =>
{
    // ...
}).ConfigurePrimaryHttpMessageHandler(() =>
{
    return new HttpClientHandler
    {
        ClientCertificateOptions = ClientCertificateOption.Manual,
        ServerCertificateCustomValidationCallback =
            (httpRequestMessage, cert, certChain, policyErrors) => true
    };
});
0

afaik to nie jest zalecana opcja jeżeli chcesz coś na poważnie robić :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1