Промежуточное перенаправление промежуточного программного обеспечения .NETCore Удаление приложения IIS - PullRequest
0 голосов
/ 27 августа 2018

У меня есть класс промежуточного программного обеспечения, который читает файлы cookie пользователя и проверяет их, а затем перенаправляет на URL-адрес входа в систему, если они недействительны или отсутствуют.URL, на который перенаправляется пользователь, содержит параметр «назад».Это промежуточное ПО прекрасно работает в SPA со статическим файлом, и когда приложение не является вложенным приложением в IIS.

Мой вопрос, это не работает при использовании контроллеров MVC и представлений, пока пользователь не будет перенаправлен наНа странице входа каким-либо образом путь (который указывает на вложенный сайт IIS) удаляется, а обратный URL-адрес не содержит URL-пути.Есть идеи?

Что происходит

Перейти к -> http://test.com/mysite

Перенаправляет на -> http://login.com? Назад = http://test.com

Что должно произойти

Перейти к -> http://test.com/mysite

Перенаправляет на -> http://login.com? Назад = http://test.com/mysite

public class MyMiddleware
  {

    private readonly RequestDelegate _next;

    private readonly ILogger _logger;

    private readonly IOptions<MyMiddlewareOptions> _options;


    public MyMiddleware(RequestDelegate next, IOptions<MyMiddlewareOptions> options, ILoggerFactory logger)
    {
      _next    = next;
      _options = options;
      _logger = logger.CreateLogger("My Middleware");
    }


      public async Task Invoke(HttpContext context)
    {
      var middlewareCookieValidator = context.RequestServices.GetService<IMiddlewareCookieValidator>();

      await new CookieRequestCultureProvider().DetermineProviderCultureResult(context);

      if (!_options.Value.Bypass && !Path.HasExtension(context.Request.Path.Value))
      {
        try
        {
            if (wslCookieValidator.HasCreatedCookies(context) || await middlewareCookieValidator.ValidateCookiesAsync())
            {
              context.Response.OnStarting(async () => await middlewareCookieValidator.GenerateAndApplyCookiesToResponse(context));

              await _next(context);
            }
            else
            {
              var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}");

              context.Response.Redirect($"{_options.Value.Url}?back={location}");
            }

        }
        catch (Exception exception)
        {
          throw new Exception($"RequestDelegate '_next' = {_next}.  {exception.Message}");
        }
      }
      else
      {
        await _next(context);
      }
    }

  }

}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

@ Лекс Ли

Спасибо за ваш ответ, получается из-за IIS, работающего с подпрограммами.

Мне нужно было следующее, чтобы он работал.

var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}");
0 голосов
/ 27 августа 2018

Это может быть проблема с кодировкой URL.Вы должны закодировать URL, который вы передаете, в параметр строки запроса back, используя System.Net.WebUtility.UrlEncode().Например:

using System.Net;

// ...

var location = new Uri($"{context.Request.Scheme}://{context.Request.Host}{context.Request.Path}{context.Request.QueryString}");

context.Response.Redirect($"{_options.Value.Url}?back={WebUtility.UrlEncode(location)}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...