我有一个看起来像这样的项目结构。
-IdentityServer(:5000)
-后端管理员(:4000)
-WebUi(:3000)
我要实现的是在启动类(Admin)中实现一个重写规则,该规则仅允许通过以下方式访问后端 一个“秘密”网址。
所以流程应该像这样:
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再次调用Rule,这似乎是webUi实现的。
第二次,当我输入'SecretUrl'时,首先点击了 if 语句,但是没有重定向到Home / Index,而是再次以“ Home / Index”作为路径来命中规则。上面的周期开始了,我最终进入了webui。
任何人都知道我如何在IRule中实现所需的逻辑。 它不必遵循这种确切的方法,但是我不希望使用太多随机代码来污染启动。
谢谢。