You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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框架的内置机制,直接从认证用户对象获取信息,无需额外存储:

  1. 在Header视图顶部注入UserManager:
@inject UserManager<IdentityUser> UserManager

注:如果使用自定义用户实体,将IdentityUser替换为你的实体类型

  1. 修改用户名显示逻辑,同时根据登录状态切换导航:
<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持久化用户名:

  1. 启用Session支持:
    在Program.cs中添加Session服务配置:
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // 设置会话超时时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

并在中间件链中启用Session:

app.UseSession();
  1. 修改Controller登录逻辑,将用户名存入Session:
if (result.Succeeded)
{
    HttpContext.Session.SetString("kullanici", p.username);
    return RedirectToAction("Index", "Home");
}
  1. 在Header视图中读取Session:
@if (!string.IsNullOrEmpty(Context.Session.GetString("kullanici")))
{
    <span>@Context.Session.GetString("kullanici")</span>
}
  1. 登出时清除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:27:07