Проект MVC использует проект Web API внутри того же контейнера Docker - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь узнать больше о Docker в свободное время. В настоящее время я пытаюсь настроить ASP.NET Identity Server для работы с ним.

Вот шаги, которые я предпринял:

  1. Загрузить: https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/6_AspNetIdentity

  2. Запустите клиентское приложение ASP.NET MVC и серверное приложение и перейдите по следующему URL-адресу, чтобы убедиться, что оно работает правильно: http://localhost:5002/Home/CallApiUsingClientCredentials

    Код выглядит так:

    public async Task<IActionResult> CallApiUsingClientCredentials()
    {
            var tokenClient = new TokenClient("http://localhost:5000/connect/token", "mvc", "secret");
            var tokenResponse = await tokenClient.RequestClientCredentialsAsync("api1");
    
            var client = new HttpClient();
            client.SetBearerToken(tokenResponse.AccessToken);
            var content = await client.GetStringAsync("http://localhost:5001/identity");
    
            ViewBag.Json = JArray.Parse(content).ToString();
            return View("Json");
    }
    

    Я получил ожидаемый ответ.

  3. Щелкните правой кнопкой мыши по проекту API и выберите «Добавить поддержку оркестровки контейнера».

  4. Щелкните правой кнопкой мыши MVCClient и выберите: Add / Container Orchestration Support.

Docker Compose Override выглядит следующим образом:

version: '3.4'

services:
  mvcclient:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "5002:80"

  api:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "5001:80"


  identityserverwithaspnetidentity:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "5000:80"

Внесите изменения в приведенный выше код следующим образом:

Строка 3 изменяется на:

var tokenClient = new TokenClient("http://identityserverwithaspnetidentity:80/connect/token", "mvc", "secret");

Строка 10 изменяется на:

var content = await client.GetStringAsync("http://api:80/Identity");

Когда я просматриваю http://localhost:5002/Home/CallApiUsingClientCredentials;, я получаю странный ответ:

<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"><html><head><meta http-equiv=\"refresh\" content=\"0;url=http://www.webaddresshelp.bt.com/main?ParticipantID=mg76cjr54t8kx45jjw4j4k9j5hsr5m26&FailedURI=http%3A%2F%2Fapi1%2FIdentity&FailureMode=1&Implementation=&AddInType=4&Version=pywr1.0&ClientLocation=uk\"/><script type=\"text/javascript\">url=\"http://www.webaddresshelp.bt.com/main?ParticipantID=mg76cjr54t8kx45jjw4j4k9j5hsr5m26&FailedURI=http%3A%2F%2Fapi1%2FIdentity&FailureMode=1&Implementation=&AddInType=4&Version=pywr1.0&ClientLocation=uk\";if(top.location!=location){var w=window,d=document,e=d.documentElement,b=d.body,x=w.innerWidth||e.clientWidth||b.clientWidth,y=w.innerHeight||e.clientHeight||b.clientHeight;url+=\"&w=\"+x+\"&h=\"+y;}window.location.replace(url);</script></head><body></body></html>

В чем проблема, пожалуйста?

Обновление

Почему строки ниже возвращают вывод выше (что я назвал странным ответом):

var content = await client.GetStringAsync("http://bert:80/Identity");
var content = await client.GetStringAsync("http://somerandomserver:80/Identity");
var content = await client.GetStringAsync("http://hello:80/Identity");

Bert; somerandomserver и привет не существует. Кажется, что ответ выше всегда получен, пока я использую порт 80, то есть независимо от имени сервера, который я использую, то есть я могу сделать это. Почему?

1 Ответ

0 голосов
/ 01 ноября 2018

Для веб-приложений в docker compose они используют одни и те же сети в Compose.

Судя по вашим шагам, вы изменили только URL-адреса запроса. Вам также необходимо изменить Authority в проекте API.

Попробуйте изменить src\Api\Startup.cs на следующее:

            services.AddAuthentication("Bearer")
            .AddIdentityServerAuthentication(options =>
            {
                options.Authority = "http://identityserverwithaspnetidentity:80";
                options.RequireHttpsMetadata = false;

                options.ApiName = "api1";
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...