Как заставить приложение Asp.NET Core MVC использовать внешние URL-адреса при перенаправлении авторизации?

Ищу решение проблемы, указанной в заголовке вопроса. Чтобы быть более точным - я запускаю тестовое приложение (asp.net core / mvc) и туннелирую его, чтобы он был доступен во всем мире, используя https://ngrok.com. Для этого я использую следующую команду:

ngrok.exe http -host-header = перезаписать localhost: 62274

«ngrok.exe http» используется для инициализации ngrok, «-host-header = rewrite localhost: 62274» изменяет заголовок, чтобы разрешить выполнение приложения (поскольку IIS проверяет заголовок и блокирует любой другой).

Проблема, с которой я столкнулся, заключается в том, что после неудачной авторизации (гости пытаются получить доступ к странице с ограниченным доступом) [Authorize] указывает на внутренние ссылки (например, "http://localhost:62274/Account/Login"). Это не предназначено.
Все ссылки, предоставляемые видами приложения, работают правильно (они используют префикс адреса, предоставленный ngrok). Мне пришлось исправить параметры returnUrl для входа / регистрации, но теперь они работают безупречно.

Я искал ответ на эту проблему уже 2 дня. Как было сказано ранее, это тестовое приложение, которое я делаю для изучения программирования в ядре .NET. Ограничение заключается в том, что я не хочу писать свою собственную авторизацию - это связано с моей неопытностью, для этого потребуются постоянные обновления безопасности, и нет смысла изобретать велосипед, верно?

Проблема возникает:

[Authorize("Admin")]
public async Task<IActionResult> DeleteDItem(int? id)

Вместо перенаправления на: http: // ‹8_random_characters> .ngrok.io / Account / Login он указывает на: http://localhost:62274/Account/Login

Подробнее (это первый вопрос, который я пишу здесь КОГДА-ЛИБО, поэтому я хочу, чтобы он был в некоторой степени правильным):
- это веб-приложение ASP.NET Core, использующее по умолчанию MVS2015 «Индивидуальная аутентификация пользователя»,
- связанный проект. информация json:

"dependencies": {  
  "BundlerMinifier.Core": "2.1.258",  
  "Microsoft.ApplicationInsights.AspNetCore": "1.0.0",  
  "Microsoft.AspNet.Authentication.Google": "1.0.0-rc1-final",  
  "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",  
  "Microsoft.AspNetCore.Authentication.Facebook": "1.0.0",  
  "Microsoft.AspNetCore.Authentication.Google": "1.0.0",  
  "Microsoft.AspNetCore.Authorization": "1.0.0",  
  "Microsoft.AspNetCore.Diagnostics": "1.0.0",  
  "Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore": "1.0.0",  
  "Microsoft.AspNetCore.Identity.EntityFrameworkCore": "1.0.0",  
  ...
  "Npgsql.EntityFrameworkCore.PostgreSQL": "1.0.0"

- связанные части Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
  services.AddAuthorization(options =>
  {
    options.AddPolicy("Admin", policy => 
                               policy.RequireAuthenticatedUser());                
  });
  services.AddIdentity<ApplicationUser, IdentityRole>()
          .AddEntityFrameworkStores<ApplicationDbContext>()
          .AddDefaultTokenProviders();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env,
                      ILoggerFactory loggerFactory)
{
  app.UseIdentity();
}

person Hekkaryk    schedule 14.07.2016    source источник
comment
Я согласен с @Akkaryk, и я также подтвердил, что эта проблема является новой в ядре ASP.net. ngrok хорошо работает с ASP.net MVC 5.   -  person dotnetstep    schedule 15.07.2016
comment
Не добавляйте РЕШЕНИЕ к заголовку и не отвечайте на вопрос в самом вопросе. Вместо этого отправьте ответ.   -  person CodeCaster    schedule 19.07.2016
comment
@CodeCaster Ответ был размещен ниже (только в комментариях к ответу). Нет смысла оставлять вопрос без четкого указания, что он решен - и нет смысла не включать решение в конце вопроса iself (эффективность! ^^ ни у кого из новых нет времени прочитать все ответы и комментарии)   -  person Hekkaryk    schedule 19.07.2016
comment
Нет, этот сайт просто не так работает. Знак принятия означает, что этот вопрос был решен за вас. Пожалуйста, опубликуйте ответ и оставьте свой ответ вне вопроса.   -  person CodeCaster    schedule 19.07.2016
comment
@CodeCaster Okaaay - думаю, я действительно здесь новенький. Хорошо, я сделаю, как ты говоришь ^^ '   -  person Hekkaryk    schedule 19.07.2016


Ответы (1)


Обновление 1. (Об исходном выпуске читайте ниже).

Решение 1. Сделайте так, чтобы он работал с IIS. Теперь я заставил его работать с IIS. (не с IIS Express).

  1. Я публикую сайт по конкретному порту на локальном iis.

  2. Я использовал следующую команду.

ngrok.exe http 8042 (какой бы порт вы ни выбрали)

убедитесь, что вы использовали указанную выше команду, которая не используется вами. В вашей команде вы использовали специальный параметр -host-header = rewrite. Теперь эта опция будет перезаписывать значение хоста при перемещении запроса с iis на сервер Kerstel. Это значение хоста используется для создания URL-адреса входа и создания проблемы.

ngrok.exe http -host-header = перезаписать localhost: 62274

Решение 2. Заставьте его работать с IIS Express.

Вам все равно придется использовать ту же команду, которую я использовал вместо вашей.

ngrok.exe http номер вашего порта

Теперь, чтобы заставить его работать с IIS Express, вам нужно перейти в корневую папку вашего решения. Там вы найдете папку .vs. (Он скрыт). поэтому вы также должны включить просмотр скрытых папок.

Теперь перейдите в .vs -> Config -> applicationhost.config

Откройте этот файл и найдите раздел сайтов, он будет выглядеть примерно так. (Я удалил много кода, так как вам нужно обновить информацию о привязке)

<sites>          
            <site name="WebApplication2" id="4">                
                <bindings>
                    <binding protocol="http" bindingInformation="*:12619:localhost" />
                </bindings>
            </site>           
        </sites>

Замените его на (см. Я заменяю localhost на *)

<sites>          
            <site name="WebApplication2" id="4">                
                <bindings>
                    <binding protocol="http" bindingInformation="*:12619:*" />
                </bindings>
            </site>           
        </sites>

Примечание: 1. Если VS уже находится в режиме отладки, остановите его и запустите снова. Теперь он должен работать. Как это работает у меня.

  1. Ранее в комментарии я писал, что он хорошо работает с MVC5, но только тогда, когда вы используете аутентификацию по умолчанию. Если вы используете конвейер Owin и используете переключатель -host-header в переключателе ngrok.exe, вы получите ту же ошибку.

На самом деле я хочу поставить это в комментарии, но он немного длиннее, поэтому я помещен сюда. Это причина, по которой так происходит.

  1. Настоящая причина этого в том, что он не может правильно построить URL. https://github.com/aspnet/Security/blob/dev/src/Microsoft.AspNetCore.Authentication/AuthenticationHandler.cs

В приведенном выше файле cs BuildRedirectUri создается uri для входа в систему.

  1. Вторая причина: когда вы используете ngrok и соблюдаете Request.Host, это всегда localhost: ‹> это создает проблему. (Это главный виновник)

  2. Я тестировал другой способ, используя файл хоста, и он работает нормально. Request.Host отображает правильное имя хоста.

Согласно моему мнению и более старой версии MVC5, вместо localhost должно сохраняться имя хоста ngrok. Я думаю, что реальная проблема заключается в том, когда запрос перемещается из IIS в Kestrel.

person dotnetstep    schedule 15.07.2016
comment
К сожалению, следование вашей инструкции @dotnetstep приводит к следующему: ссылка и после перезагрузки всей Visual Studio на это: ссылка ... Я, наверное, снова что-то делаю не так: | Вот мой весь файл applicationhost.config: ссылка - я не мог удалить части, которые вы не включили, так как они были регенерированы при сборке как сайт: AppPostgreSQL (2) ... - person Hekkaryk; 18.07.2016
comment
Хорошо - это выглядит как 100% верное решение, но не работает. Если я изменю localhost на *, он либо откажется строить проект, либо добавит новый ‹site› ​​с: localhost. Есть другие идеи? Кто-нибудь? - person Hekkaryk; 19.07.2016
comment
Вы пробовали опубликовать локальный iis вместо iis express? Также вам просто нужно изменить localhost на * в файле конфигурации хоста приложения. - person dotnetstep; 19.07.2016
comment
Когда я меняю localhost на * в файле applicationhost.config, проект не создается (с ошибками, указанными выше). Позже он добавит новую запись ‹movie› ниже с более высоким идентификатором и восстановленной частью localhost. Про локальный IIS - не делал - попробую, поможет ли;) - person Hekkaryk; 19.07.2016
comment
Я подтвердил, что ошибка возникает после публикации в IIS (даже в Ubuntu - проблема возникла изначально в Windows 10). Я уверен, что виноват в использовании ngrok с -host-header = rewrite localhost: ‹port›, но я не могу запустить приложение с * заменой localhost. Я попытаюсь создать и опубликовать приложение, не запуская его (с * как предлагается, и без -host-header = rewrite). - person Hekkaryk; 19.07.2016
comment
Проблема решена: запуск опубликованного приложения без модификаторов для ngrok устранил проблему. Тем не менее, у меня возникли проблемы с публикацией приложения в Windows (смеется), поэтому я могу опубликовать его только на Ubuntu XD Спасибо за терпение и предложение (даже если весь ваш подробный ответ ничего не исправил) ^^ - person Hekkaryk; 19.07.2016
comment
Вы читали мое решение №1? Я указал то, что вы пишете в качестве ответа - person dotnetstep; 19.07.2016
comment
Я сдаюсь - вы правы - за исключением того, что изменение applicationhost.config не работает и не является необходимым (публикация и использование IIS - это только рабочий способ). Я сейчас уберу этот беспорядок - еще раз спасибо! ^^ - person Hekkaryk; 20.07.2016