ASP.NET Core Razor Pages:如何避免重复编写登录校验代码?
解决Razor Pages全局登录校验的几种方案
你不用在每个页面重复写登录校验逻辑,这里有几种高效的全局实现方式:
1. 自定义基类页面模型
创建一个继承自PageModel的基类,把校验逻辑写在里面,之后所有需要登录校验的页面都继承这个基类即可:
public class AuthRequiredPageModel : PageModel { public override void OnPageHandlerExecuting(PageHandlerExecutingContext context) { base.OnPageHandlerExecuting(context); if (HttpContext.Session.GetString("first_name") == null) { context.Result = new RedirectResult("/Authentication/Login"); } } }
然后修改你的页面模型,替换继承关系:
// 原来的 public class IndexModel : PageModel public class IndexModel : AuthRequiredPageModel { // 页面原有逻辑保持不变 }
这种方式灵活,不想校验的页面可以继续继承原生PageModel。
2. 全局页面过滤器
通过注册全局页面过滤器,让所有Razor Pages自动执行校验逻辑,还能灵活排除特定页面:
首先创建过滤器类:
public class LoginCheckFilter : IPageFilter { public void OnPageHandlerExecuting(PageHandlerExecutingContext context) { // 排除登录页面,避免重定向死循环 if (context.HttpContext.Request.Path.StartsWithSegments("/Authentication/Login")) { return; } if (context.HttpContext.Session.GetString("first_name") == null) { context.Result = new RedirectResult("/Authentication/Login"); } } // 以下两个方法无需具体实现 public void OnPageHandlerExecuted(PageHandlerExecutedContext context) { } public void OnPageHandlerSelected(PageHandlerSelectedContext context) { } }
然后在Program.cs(.NET 6+)里注册过滤器:
builder.Services.AddRazorPages(options => { options.Filters.Add<LoginCheckFilter>(); });
如果个别页面不需要校验,可以给该页面模型添加特性:
[IgnoreFilter(typeof(LoginCheckFilter))] public class PublicPageModel : PageModel { // 公开页面逻辑 }
3. 自定义中间件
如果需要全站(包括非Razor Pages请求)都做登录校验,可以用中间件实现:
创建中间件类:
public class LoginCheckMiddleware { private readonly RequestDelegate _next; public LoginCheckMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context) { var requestPath = context.Request.Path; // 排除登录页、静态资源(css/js/lib等),避免不必要的校验 if (!requestPath.StartsWithSegments("/Authentication/Login") && !requestPath.StartsWithSegments("/css") && !requestPath.StartsWithSegments("/js") && !requestPath.StartsWithSegments("/lib")) { if (context.Session.GetString("first_name") == null) { context.Response.Redirect("/Authentication/Login"); return; } } // 继续执行后续管道 await _next(context); } }
在Program.cs里注册中间件(注意顺序:放在UseSession之后,UseRazorPages之前):
app.UseSession(); app.UseMiddleware<LoginCheckMiddleware>(); app.UseRazorPages();
内容的提问来源于stack exchange,提问作者RGF Drone
相关产品推荐
相关产品推荐

