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

如何在ASP.NET Core Razor页面导航栏显示Windows认证用户名

在ASP.NET Core Razor Pages全局导航栏显示Windows认证用户名的方案

你的现有代码仅在IndexModel中设置了ViewData["UserName"],只能在首页访问到该值,要实现所有页面导航栏统一显示,推荐以下几种贴合Razor Pages特性的方案:

前提:确保依赖注入配置正确

首先要在Program.cs中注册必要的服务,因为IHttpContextAccessor默认未注册,同时把你的WindowsUserIdentity类纳入DI容器:

builder.Services.AddHttpContextAccessor();
// 注册为Scoped,和请求生命周期一致
builder.Services.AddScoped<WindowsUserIdentity>();

方案一:直接在布局页面注入使用(最简单)

所有Razor Pages默认共享_Layout.cshtml布局页面,直接在导航栏位置注入服务并获取用户名:

方式1:注入你的WindowsUserIdentity类

修改_Layout.cshtml,在导航栏合适位置添加:

<div class="navbar-text ms-auto">
    当前登录用户: @inject WindowsUserIdentity WinUser; @WinUser.GetUserIdentity()
</div>

方式2:直接注入IHttpContextAccessor(无需额外类)

如果不想依赖自定义的WindowsUserIdentity,可以直接通过IHttpContextAccessor获取用户信息:

<div class="navbar-text ms-auto">
    当前登录用户: @inject IHttpContextAccessor HttpContextAccessor; @HttpContextAccessor.HttpContext.User.Identity.Name
</div>

方案二:使用ViewComponent(更模块化)

如果需要对用户信息展示做更复杂的逻辑(比如格式化用户名、添加权限标识),可以用ViewComponent封装:

1. 创建ViewComponent类

public class UserInfoViewComponent : ViewComponent
{
    private readonly WindowsUserIdentity _winUser;

    public UserInfoViewComponent(WindowsUserIdentity winUser)
    {
        _winUser = winUser;
    }

    public IViewComponentResult Invoke()
    {
        // 可在这里添加用户名格式化等逻辑
        var userName = _winUser.GetUserIdentity();
        return Content($"当前用户: {userName}");
    }
}

2. 在布局页面引用ViewComponent

修改_Layout.cshtml的导航栏:

<div class="navbar-text ms-auto">
    @await Component.InvokeAsync("UserInfo")
</div>

方案三:基于PageModel基类统一设置ViewData

如果需要在多个页面逻辑中复用用户信息,可以创建基类PageModel,在基类中统一设置ViewData:

1. 创建基类PageModel

public class BasePageModel : PageModel
{
    protected readonly WindowsUserIdentity _winUser;

    public BasePageModel(WindowsUserIdentity winUser)
    {
        _winUser = winUser;
    }

    // 在页面处理前统一设置ViewData
    public override void OnPageHandlerExecuting(PageHandlerExecutingContext context)
    {
        ViewData["UserName"] = _winUser.GetUserIdentity();
        base.OnPageHandlerExecuting(context);
    }
}

2. 所有页面Model继承基类

比如修改IndexModel:

public class IndexModel : BasePageModel
{
    public IndexModel(WindowsUserIdentity winUser) : base(winUser)
    {
    }

    public void OnGet()
    {
        // 无需再手动设置ViewData,基类已处理
    }
}

3. 在布局页面使用ViewData

修改_Layout.cshtml:

<div class="navbar-text ms-auto">
    当前登录用户: @ViewData["UserName"]
</div>

内容的提问来源于stack exchange,提问作者user21872512

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:18