Итак, я пытаюсь реализовать этот сценарий:
Когда пользователь входит в мое веб-приложение, ему нужно выбрать один из двух вариантов. Первый вариант 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";
}
}
});
}
}