Https требуется для ядра asp.net в докере - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть приложение ASP.Net Core, которое я развернул в докере.Это приложение ASP.Net действует как сервер 4 идентификации для доставки клиентских токенов.Кроме того, у меня есть простой клиент c # (консоль .net core 2.1), который отправляет запрос на обнаружение в это приложение ASP.Net и собирает метаданные, например конечные точки.

Локально все работает нормально, либо идентификациясервер или клиент работают, и я получаю ответ в клиенте от API сервера идентификации.

Я развернул API сервера идентификации в Docker и запустил его.Он работал нормально, и я могу просматривать страницу индекса, как показано на рисунке ниже:

enter image description here Но когда я пытаюсь запустить клиент для запроса токена от API сервера идентификации(размещено в Docker), оно выдает исключение (требуется Https) - см. изображение ниже:

enter image description here

Как я могу обойти это требование HTTP?Или мне нужно создать сертификат локально?Есть ли какая-либо документация, которая поможет мне понять, как мне этого добиться?

Редактировать:

Если я попытаюсь позвонить через https, тогда выдается следующая ошибка:

enter image description here

, что имеет смысл, поскольку мы не настраивали порт ssl.

Еще один момент:

После того, как я выполнил команду docker run, чтобы запустить приложение в контейнере и открыть порт 5000, я получаю только информацию о том, что контейнер теперь прослушивает порт 80 (http).Где на самом деле должны быть настроены оба (http & https), верно?Насколько я знаю (я не эксперт в этом).См. Изображение:

enter image description here

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 12 февраля 2019

Я смог решить проблему сам.Поэтому, если какое-либо тело сталкивается с той же проблемой, вы можете найти решение здесь.

На самом деле это была проблема с классом DiscoveryClient и методом GetAsync:

DiscoveryClient.GetAsync

Я переключился на нормальноеPostAsync запрос и все заработало.Вот мой код:

Вместо вызова этого:

 var discoveryClient = await DiscoveryClient.GetAsync("http://url-or-machine-ip:portnumber");
 var token = new TokenClient(discoveryClient.TokenEndpoint, "my-client-id", "my-secret");
 var response = await token.RequestClientCredentialsAsync("my-api-name");

Я написал свой собственный метод почтового запроса:

private static string GetApiToken()
{
   using (var client = new HttpClient())
   {
     //setup client
     client.BaseAddress = new Uri("http://url-or-machine-ip:portnumber");
     client.DefaultRequestHeaders.Accept.Clear();
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

     //setup login data
     var formContent = new FormUrlEncodedContent(new[]
     {
        new KeyValuePair<string, string>("grant_type", "client_credentials"),
        new KeyValuePair<string, string>("client_id", "my-client-id"),
        new KeyValuePair<string, string>("client_secret", "my-secret"),
        new KeyValuePair<string, string>("scope", "my-api-name")
     });

     //send request
     var responseMessage = client.PostAsync("connect/token", formContent).Result;

     if (responseMessage.IsSuccessStatusCode)
     {
        //get access token from response body
        var responseJson = responseMessage.Content.ReadAsStringAsync().Result;
        var jObject = JObject.Parse(responseJson);
        return jObject.GetValue("access_token").ToString();
      }

      return string.Empty;
   }
 }

и в клиенте просто вызвал:

var token = GetApiToken();

и я получил свой токен с сервера идентификации, размещенного / развернутого в докер-контейнере:

enter image description here

...