ASP.NET Core中如何让用户名持续显示至会话结束?
登录后用户名持续显示的解决方案
问题背景
登录成功后通过TempData["kullanici"]存储用户名,仅能在Header中显示一次,需要实现用户名持续显示至会话结束,尝试ViewBag未成功。
当前代码
Controller 代码
public async Task<IActionResult> Index(UserSignInViewModel p) { if (ModelState.IsValid) { var result = await _signInManager.PasswordSignInAsync(p.username, p.password, false, true); if (result.Succeeded) { TempData["kullanici"] = p.username; return RedirectToAction("Index", "Home"); } else { return RedirectToAction("Index", "Login"); } } return View(); }
Header 视图代码
<div class="col-lg-9"> <nav class="navbar navbar-expand-lg bg-light navbar-light py-3 py-lg-0 px-0"> <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbarCollapse"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse justify-content-between" id="navbarCollapse"> <div class="navbar-nav mr-auto py-0"> <a href="/" class="nav-item nav-link active">Ana Sayfa</a> <a asp-controller="Hakkımızda" asp-action="Index" class="nav-item nav-link">Hakkımızda</a> <a asp-controller="İletisim" asp-action="Index" class="nav-item nav-link">İletişim</a> </div> <span>@TempData["kullanici"]</span> <div class="navbar-nav ml-auto py-0"> <a asp-controller="Login" asp-action="Index" class="nav-item nav-link">Giriş Yap</a> <a asp-controller="RegisterUser" asp-action="Index" class="nav-item nav-link">Kayıt Ol</a> </div> </div> </nav> </div>
可行解决方案
方法1:通过ASP.NET Core Identity直接获取(推荐)
利用Identity框架的内置机制,直接从认证用户对象获取信息,无需额外存储:
- 在Header视图顶部注入
UserManager:
@inject UserManager<IdentityUser> UserManager
注:如果使用自定义用户实体,将IdentityUser替换为你的实体类型
- 修改用户名显示逻辑,同时根据登录状态切换导航:
<div class="navbar-collapse justify-content-between" id="navbarCollapse"> <!-- 原有导航链接 --> <div class="navbar-nav mr-auto py-0"> <a href="/" class="nav-item nav-link active">Ana Sayfa</a> <a asp-controller="Hakkımızda" asp-action="Index" class="nav-item nav-link">Hakkımızda</a> <a asp-controller="İletisim" asp-action="Index" class="nav-item nav-link">İletişim</a> </div> <!-- 用户名显示 --> @if (User.Identity.IsAuthenticated) { var currentUser = await UserManager.GetUserAsync(User); <span>@currentUser.UserName</span> } <!-- 登录/登出导航 --> <div class="navbar-nav ml-auto py-0"> @if (User.Identity.IsAuthenticated) { <a asp-controller="Account" asp-action="Logout" class="nav-item nav-link">Çıkış Yap</a> } else { <a asp-controller="Login" asp-action="Index" class="nav-item nav-link">Giriş Yap</a> <a asp-controller="RegisterUser" asp-action="Index" class="nav-item nav-link">Kayıt Ol</a> } </div> </div>
这种方式完全依赖Identity的认证系统,无需手动维护用户信息,是最规范可靠的实现。
方法2:使用Session存储用户名
若需独立于Identity存储,可使用Session持久化用户名:
- 启用Session支持:
在Program.cs中添加Session服务配置:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置会话超时时间 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
并在中间件链中启用Session:
app.UseSession();
- 修改Controller登录逻辑,将用户名存入Session:
if (result.Succeeded) { HttpContext.Session.SetString("kullanici", p.username); return RedirectToAction("Index", "Home"); }
- 在Header视图中读取Session:
@if (!string.IsNullOrEmpty(Context.Session.GetString("kullanici"))) { <span>@Context.Session.GetString("kullanici")</span> }
- 登出时清除Session(需对应添加Logout方法):
public async Task<IActionResult> Logout() { HttpContext.Session.Remove("kullanici"); await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); }
方法3:保留TempData(临时方案,不推荐)
TempData默认只能读取一次,可通过Keep()方法强制保留,但需每次请求手动处理,易遗漏:
@{ var kullanici = TempData["kullanici"]; if (kullanici != null) { <span>@kullanici</span> TempData.Keep("kullanici"); // 保留数据至下一次请求 } }
内容的提问来源于stack exchange,提问作者ardaoran
相关产品推荐
相关产品推荐

