ASP.NET Core 7 Razor Pages中如何统一实现控制器登录校验跳转?
ASP.NET Core 7 Razor Pages 登录校验优化方案
1. 使用内置 [Authorize] 特性(推荐)
这是ASP.NET Core官方提供的身份校验方式,完全符合DRY原则,无需手动编写重复校验逻辑。
控制器中使用
在控制器类上添加[Authorize]特性,该控制器下的所有方法都会自动校验用户是否登录:
[Authorize] public class HomeController : Controller { public IActionResult Index() { return View(); } // 其他方法自动继承登录校验 }
如果个别方法不需要校验,可添加[AllowAnonymous]特性排除:
[Authorize] public class AccountController : Controller { [AllowAnonymous] public IActionResult Login() { return View(); } public IActionResult Profile() { return View(); } }
Razor Pages 页面模型中使用
在页面模型类上添加[Authorize]特性,该页面的所有Handler方法(如OnGet、OnPost)都会自动校验:
[Authorize] public class IndexModel : PageModel { public void OnGet() { // 自动校验登录状态 } }
2. 自定义过滤器(适用于复杂校验逻辑)
如果需要除登录状态外的自定义校验规则(比如角色校验、权限判断),可以自定义Action过滤器或Page过滤器。
自定义异步Action过滤器
public class LoginCheckFilter : IAsyncActionFilter { private readonly IHttpContextAccessor _httpContextAccessor; public LoginCheckFilter(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { var user = _httpContextAccessor.HttpContext.User; if (!user.Identity.IsAuthenticated) { // 重定向到登录页 context.Result = new RedirectToActionResult("Login", "Account", null); return; } // 校验通过,继续执行后续逻辑 await next(); } }
注册并使用过滤器
在Program.cs中注册过滤器:
builder.Services.AddScoped<LoginCheckFilter>();
然后在控制器或页面模型上添加特性使用:
[ServiceFilter(typeof(LoginCheckFilter))] public class DashboardController : Controller { // 所有方法自动执行自定义校验 }
如果要全局生效(所有控制器和页面都应用校验),可全局注册:
// 控制器全局注册 builder.Services.AddControllersWithViews(options => { options.Filters.Add<LoginCheckFilter>(); }); // Razor Pages全局注册 builder.Services.AddRazorPages(options => { options.Filters.Add<LoginCheckFilter>(); });
3. Razor Pages 专属页面过滤器
针对Razor Pages,也可以实现IAsyncPageFilter来做页面级校验:
public class LoginCheckPageFilter : IAsyncPageFilter { private readonly IHttpContextAccessor _httpContextAccessor; public LoginCheckPageFilter(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next) { var user = _httpContextAccessor.HttpContext.User; if (!user.Identity.IsAuthenticated) { context.Result = new RedirectToPageResult("/Account/Login"); return; } await next(); } public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context) { return Task.CompletedTask; } }
注册方式:
builder.Services.AddRazorPages(options => { options.Filters.Add<LoginCheckPageFilter>(); });
为什么构造函数不能用于登录校验?
控制器/页面模型的构造函数在初始化阶段执行,此时HttpContext尚未完全绑定到当前请求,无法执行重定向等请求相关操作。而过滤器是ASP.NET Core请求处理流程中的一环,能访问完整的请求上下文,因此可以安全地实现校验和重定向逻辑。
内容的提问来源于stack exchange,提问作者OsKyy
相关产品推荐
相关产品推荐

