我是MVC5的新手,创建了一个测试网站来查看MVC5和Razor
用户登录后,我有一个非常简单的网站,我需要通过_Layout从“登录”更改菜单以添加“注销”“帐户”。
注意:该站点具有自己的身份验证,稍后我将介绍一次登录。
我真的很难在MVC5中管理会话数据,不确定哪种方法最好。我已经尝试了TEMP DATA,但是尽管达到了顶峰,但我发现在用户在几个页面之间进行重定向之后,数据丢失了。因此,我们看了好旧的cookie,但是由于GDPR,我可以说开箱即用的cookie的默认支持要少得多。
无论如何,我相信我在做所有正确的事情
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => false;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set session timeout value
options.IdleTimeout = TimeSpan.FromSeconds(30);
options.Cookie.HttpOnly = true;
});
}
services.AddMvc();
services.AddCaching();
services.AddSession();
services.AddHttpContextAccessor();
依赖项将其注入,但是当我尝试调用SetString时在Post中将其称为“私有只读IHttpContextAccessor _httpContextAccessor;”。为空
奇怪的是_Layout没有抛出相同的null异常
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
@{
string UserId = HttpContextAccessor.HttpContext.Session.GetString("UserId");
}
使用ASP.Net(一种简单的处理Session的方法)工作后,开始质疑我是否错过了某些东西,因为MVC5中似乎有很多工作要做。所以我应该在MVC5中使用其他方法
答案 0 :(得分:0)
设置
options.CheckConsentNeeded = context => false;
这是正确的,即
options.CheckConsentNeeded = context => true;
,您的会话将不再为空。
答案 1 :(得分:0)
只想添加此代码给其他人,可能不是最干净的代码 有了帮助表格,Sanjay现在可以启动并运行一个原始站点
启动类,示例代码
公共类启动 {
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddHttpContextAccessor();
services.AddRazorPages();
services.AddRazorPages();
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(30);
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
}
.csHtml的代码
@using Microsoft.AspNetCore.Http;
@inject IHttpContextAccessor HttpContextAccessor
@{
if (Context.Session.GetString("UserRole") != null)
{
.cs的代码
private readonly IHttpContextAccessor HttpContextAccessor;
public LoginModel(ISiteUserService siteUserService,
IHttpContextAccessor httpContextAccessor)
{
this.HttpContextAccessor = httpContextAccessor;
}
public IActionResult OnGet()
{
if(HttpContextAccessor.HttpContext.Session.GetString("UserRole")!= null)
{