У меня есть структура проекта, похожая на эту.
- 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.