Получение текущего URL и, если соответствует условию, измените его - PullRequest
0 голосов
/ 02 апреля 2020

Итак, я пытаюсь реализовать этот сценарий:

Когда пользователь входит в мое веб-приложение, ему нужно выбрать один из двух вариантов. Первый вариант add cookie со значением 1 и второй add cookie со значением 2

В моем коде есть два метода, которые просто проверяют, какой из них является моим клиентом, и они называются как это: isProfiKupac(Request) // returns True if given cookie == 1 и isJednokratanKupac(Request) // returns True if given cookie == 2

Теперь, что я хочу, это:

Пользователь пытается перейти к URL, как /LetsGoHere/ToThis ... Здесь я хочу разрешить isJednokratanKupac, но не isProfiKupac. Когда первый пытается получить доступ к этому URL, я хочу передать его, а другой хочу перенаправить его на /GoHereInstead

Вот что я пробовал:

app.Run(async (context) =>
{
    string requestedPath = context.Request.Path.Value.ToLower();

    Debug.Log("I am accessing through: " + requestedPath); // my debug log

    if(requestedPath.Contains("letsgohere") && !isJednokratanKupac(context.Request))
    {
        context.Request.Path = "/GoHereInstead";
    }
}

Проблема i do is is requestedPath никогда не возвращает /LetsGoHere/ToThis, но вместо этого возвращает все изображения, отображаемые на этой странице. Итак, я хочу проверить только основной URL, а не все URL, которые загружаются внутри этой страницы.

Также рассматривается использование map (не знаю, как это работает), но мои настройки немного сложнее, чем выше код, и вы можете посмотреть его здесь (это может помочь), но проблема сводится в коде, который вы уже прочитали.

Вот полный код:

public class Startup
{
    // Linkovi koji su dostupni svima
    static string[] links = new string[] { "/home/success", "/proizvod/", "/kontakt", "/porudzbina", "/home/dostava", "/user/registracija", "/home/pizaberijednokratnog", "/home/pizaberiprofi" };

    // Linkovi koji su dostupni profesionalnim kupcima
    static string[] links1 = new string[] { "/proizvodi", "/korpa", "/user", "/admin" };

    // Linkovi koji su dostupni jednokratnim kupcima
    static string[] links2 = new string[] { "/proizvodi", "/korpa" };



    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
        Initialize();
    }

    public IConfiguration Configuration { get; }

    private void Initialize()
    {
        AR.AR.ConnectionString = Program.ConnectionString;
        AR.ARWebAuthorization.ARWebAuthorization.AutoUserTimeout = true;
        AR.TDShop.Buffer.Started = true;
    }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => false;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        if (true == false) // Do not mind this
        {
            services.AddHttpsRedirection(options =>
            {
                options.HttpsPort = 443;
            });
        }

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        AR.Statistic.Visits.Initialize(Path.Combine(env.WebRootPath, "Statistics"));
        AR.Statistic.Visitors.Initialize(Path.Combine(env.WebRootPath, "Statistics"));

        var cultureInfo = new CultureInfo("en-US");
        cultureInfo.NumberFormat.NumberGroupSeparator = ",";
        cultureInfo.NumberFormat.NumberDecimalSeparator = ".";
        cultureInfo.NumberFormat.CurrencyDecimalSeparator = ",";
        cultureInfo.NumberFormat.CurrencyGroupSeparator = ",";
        CultureInfo.DefaultThreadCurrentCulture = cultureInfo;

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();



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

        app.Run(async (context) =>
        {
            Program.AbsolutePath = env.WebRootPath;

            string requestedPath = context.Request.Path.Value.ToLower();

            if(Security.isProfiKupac(context.Request))
            {
                AR.ARWebAuthorization.ARWebAuthorizationUser u = AR.ARWebAuthorization.ARWebAuthorization.GetUser(context.Request.Cookies["h"]);

                if(u != null)
                {
                    AR.Debug.Log("Ulazim kao profi kupac koji je ulogovan.", "[ middleware - " + requestedPath + " ]");
                    // Znaci da je izabrao da je profi i da je ulogovan
                    int i = links.Count(x => requestedPath.Contains(x));
                    i += links1.Count(x => requestedPath.Contains(x));

                    if(i == 0)
                    {
                        context.Request.Path = "/User";
                    }
                }
                else if(requestedPath.Contains("/user/alogin"))
                {
                    AR.Debug.Log("Ulazim kao profi kupac koji nije ulogovan ali pokusavam da se ulogujem", "[ middleware - " + requestedPath + " ]");
                    // znaci da je izabrao da je prof ali jos uvek nije ulogovan

                }
                else
                {
                    AR.Debug.Log("Ulazim kao profi kupac, ali nisam ulogovan, ali pokusavam nesto kao da jesam.", "[ middleware - " + requestedPath + " ]");

                    // znaci da je izabrao da je profi ali nije ulogovona i pokusava nesto
                    int i = links.Count(x => requestedPath.Contains(x));

                    if(i == 0)
                    {
                        context.Request.Path = "/Home/IzaberiTip";
                    }
                }
            }
            else if(Security.isJednokratanKupac(context.Request))
            {
                AR.Debug.Log("Ulazim kao jednokratni kupac.", "[ middleware - " + requestedPath + " ]");
                // Znaci da je izabrao da je jednokratan kupac
                int i = links.Count(x => requestedPath.Contains(x));
                i += links2.Count(x => requestedPath.Contains(x));

                if (i == 0)
                {
                    context.Request.Path = "/Proizvodi";
                }
            }
            else
            {
                AR.Debug.Log("Ulazim kao nepoznati kupac", "[ middleware - " + requestedPath + " ]");

                int i = links.Count(x => requestedPath.Contains(x));

                if (i == 0)
                {
                    context.Request.Path = "/Home/IzaberiTip";
                }
            }
        });
    }
}
...