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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:20:17