Перенаправить в классе запуска с помощью IRule - .Net core 2 - PullRequest
0 голосов
/ 07 июля 2019

У меня есть структура проекта, похожая на эту.

- IdentityServer (: 5000)
- Backend-Admin (: 4000)
- WebUi (: 3000)

Чего я хочу добиться, так это реализовать правило перезаписи в моем классе запуска (Admin), которое разрешает доступ к бэкэнду только через «секретный» URL.

Так поток должен выглядеть так:

localhost: 4000 / SecretUrl -> localhost: 5000 / login

localhost: 4000 / NotSecretUrl -> localhost: 3000 / Index

Я использовал документы здесь https://docs.microsoft.com/en-us/aspnet/core/fundamentals/url-rewriting?view=aspnetcore-2.2 в качестве отправной точки ..

Класс запуска:

// Create Default Redirection Rules
   var options = new RewriteOptions().Add(new RedirectDefaultRequest());
   app.UseRewriter(options);

// Map Mvc Routes
   app.UseMvc(routes =>
   {
        routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
    });

Реализация IRule

public class RedirectDefaultRequest : IRule
{
    // Ctor
    public RedirectDefaultRequest()
    {
    }

    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;

        if (request.Path.StartsWithSegments(new PathString("/SecretUrl")))
        {
            var response = context.HttpContext.Response;
            response.Headers[HeaderNames.Location] = "/Home/Index";
            response.StatusCode = StatusCodes.Status301MovedPermanently;

            context.Result = RuleResult.EndResponse;
        }
        else
        {
            var response = context.HttpContext.Response;
            response.Headers[HeaderNames.Location] = "http://localhost:3000";
            response.StatusCode = StatusCodes.Status301MovedPermanently;

            context.Result = RuleResult.EndResponse;
        }
    }
}

Теперь я столкнулся с несколькими проблемами, связанными с этим подходом.

Во-первых, когда я вхожу в NotSecretUrl, оператор else срабатывает, но после перенаправления правило вызывается снова для каждого вызова ajax, который, кажется, реализует webUi.

Во-вторых, когда я вхожу в 'SecretUrl', сначала выполняется оператор , если , но вместо перенаправления на Home / Index на правило снова обращаются теперь с "Home / Index" в качестве пути. Тогда выше цикл начинается, и я в конечном итоге в веби ..

Кто-нибудь знает, как я могу реализовать желаемую логику в IRule. Это не должно следовать этому точному назначению, но я предпочитаю не загрязнять стартап большим количеством случайного кода.

Thx.

...