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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:32:21