使用IRule-.Net core 2

时间:2019-07-07 11:37:13

标签: c# .net asp.net-core asp.net-core-mvc asp.net-core-2.0

我有一个看起来像这样的项目结构。

 -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中实现所需的逻辑。 它不必遵循这种确切的方法,但是我不希望使用太多随机代码来污染启动。

谢谢。

0 个答案:

没有答案