ASP.NET Core 6.0 Razor Pages如何获取当前登录用户信息
结论
你不需要为Razor Pages应用额外创建控制器,也不需要手动回写传统的Startup.cs文件。ASP.NET Core 6.0 Razor Pages原生支持读取已认证用户信息,完全适配你当前IIS托管+前置SSO认证的部署场景。
具体实现步骤
1. 基础服务配置(仅需修改Program.cs)
ASP.NET Core 6.0采用顶级语句的最小托管模型,不需要单独的Startup.cs,直接在默认生成的Program.cs里补充认证相关配置即可,注意中间件的注册顺序不能乱:
using Microsoft.AspNetCore.Server.IISIntegration; var builder = WebApplication.CreateBuilder(args); // 注册Razor Pages基础服务 builder.Services.AddRazorPages(); // 启用IIS集成认证,接收父站点SSO传递的用户身份凭据 builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); builder.Services.AddAuthorization(); var app = builder.Build(); // 中间件顺序:异常处理/静态文件 -> 认证 -> 授权 -> 路由映射 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
2. 两种获取用户信息的常用方式
Razor Pages的页面模型(PageModel)和视图模板都内置了和MVC完全一致的User对象(类型为ClaimsPrincipal),可以直接读取用户ID、用户名、角色等信息,不需要额外注入服务。
- 在后端PageModel中获取:
public class IndexModel : PageModel { public string? CurrentUserId { get; set; } public string? CurrentUserName { get; set; } public List<string> CurrentUserRoles { get; set; } = new(); public void OnGet() { // 读取用户ID CurrentUserId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 读取用户名 CurrentUserName = User.Identity?.Name; // 读取用户所属所有角色 CurrentUserRoles = User.Claims .Where(c => c.Type == ClaimTypes.Role) .Select(c => c.Value) .ToList(); // 也可以直接做角色判断 var hasAccess = User.IsInRole("你配置的允许访问角色名"); } }
- 在前端Razor视图中直接读取,不需要后端传值:
@page @model IndexModel <div> <p>当前登录用户:@User.Identity?.Name</p> <p>用户ID:@User.FindFirstValue(ClaimTypes.NameIdentifier)</p> @if (User.IsInRole("允许访问的角色名")) { <p>您拥有站点访问权限</p> } </div>
场景适配注意事项
- 你已经在IIS层配置了角色访问规则,未授权的请求会被IIS直接拦截,不会到达应用层,所以应用代码里不需要额外加全局授权校验,只要配置了认证中间件,
User属性就一定能拿到SSO传递的有效身份信息。 - 如果出现角色、用户ID读取为空的情况,优先排查父站点SSO模块、IIS认证配置是否正确将身份声明写入请求上下文,应用端不需要实现独立的认证逻辑。
- 不需要为了兼容MVC的用户获取方式额外添加控制器,Razor Pages的上下文能力和MVC完全对齐,不存在功能缺失。
内容的提问来源于stack exchange,提问作者LeSteelBox
相关产品推荐
相关产品推荐

