ASP.NET MVC自定义认证时Session未配置异常的解决方法
解决方案
1. 完整配置Session服务
你遇到的异常核心原因是Session配置不完整——仅添加app.UseSession()还不够,必须先在服务注册阶段完成Session的初始化,且配置顺序有严格要求:
在Startup.cs的ConfigureServices方法中注册Session服务:
public void ConfigureServices(IServiceCollection services) { // 注册Session并配置基础参数 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // Session过期时间 options.Cookie.HttpOnly = true; // 防止前端JS读取Session Cookie,提升安全性 options.Cookie.IsEssential = true; // 标记Cookie为必要,符合GDPR要求 }); // 注册MVC控制器服务 services.AddControllersWithViews(); }
在Configure方法中启用Session(注意顺序):
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 启用Session:必须放在UseRouting之后,UseAuthorization/UseEndpoints之前 app.UseSession(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
2. 修正Session检查代码
Session.Keys是ICollection<string>类型,直接调用Contains方法即可,原代码的泛型写法Contains<string>()是错误的:
// 修正后的认证检查代码 if (!HttpContext.Session.Keys.Contains("authentication")) { return RedirectToAction("Login", "Account"); }
如果是在控制器类中编写代码,还可以直接使用基类的Session属性,无需写HttpContext.Session:
if (!Session.Keys.Contains("authentication")) { return RedirectToAction("Login", "Account"); }
3. 补充:用户名存入Session的示例
登录验证通过后,将用户名存入Session:
// 登录成功后执行 Session.SetString("authentication", "当前登录用户名");
后续获取用户名可使用:
var currentUserName = Session.GetString("authentication");
内容的提问来源于stack exchange,提问作者SNBS
相关产品推荐
相关产品推荐

