如何在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
相关产品推荐
相关产品推荐

