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

ASP.NET Core Razor Pages中401/403错误页面重定向问题咨询

解决Razor Pages中401/403授权错误的页面重定向问题

核心原因

你之前尝试的UseStatusCodePages系列中间件不生效,是因为ASP.NET Core的授权系统在管道早期就完成了权限验证,返回401/403响应时不会进入后续的StatusCodePages中间件流程,而是直接生成响应。要处理这类错误,需要拦截授权系统的挑战/禁止事件,而非依赖通用状态码中间件。

方案一:Cookie认证场景下直接配置重定向(最简单)

如果项目使用Cookie认证,可直接在认证配置中指定无权限时的跳转地址:

builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        // 未登录(401)时重定向
        options.LoginPath = "/Error/Unauthorized";
        // 无权限(403)时重定向
        options.AccessDeniedPath = "/Error/Unauthorized";
    });

方案二:自定义授权结果处理器(灵活适配所有认证类型)

若需要更定制化的逻辑,比如根据错误类型跳转不同页面,可实现IAuthorizationMiddlewareResultHandler接口:

  1. 创建自定义处理类
public class CustomAuthorizationHandler : IAuthorizationMiddlewareResultHandler
{
    private readonly AuthorizationMiddlewareResultHandler _defaultHandler = new();

    public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
    {
        // 处理无权限(403)
        if (authorizeResult.Forbidden)
        {
            context.Response.Redirect("/Error/Unauthorized");
            return;
        }
        // 处理未认证(401)
        if (authorizeResult.Challenged)
        {
            context.Response.Redirect("/Error/Unauthorized");
            return;
        }

        // 其他情况走默认处理逻辑
        await _defaultHandler.HandleAsync(next, context, policy, authorizeResult);
    }
}
  1. 在Program.cs中注册服务
builder.Services.AddSingleton<IAuthorizationMiddlewareResultHandler, CustomAuthorizationHandler>();

方案三:Razor Pages全局过滤器(页面级统一处理)

针对Razor Pages,可添加全局过滤器统一拦截权限验证:

builder.Services.AddRazorPages(options =>
{
    options.Filters.Add(new CustomAuthorizationFilter());
});

// 自定义过滤器实现
public class CustomAuthorizationFilter : IAsyncPageFilter
{
    public async Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context)
    {
        var authorizeAttr = context.HandlerMethod.MethodInfo.GetCustomAttribute<AuthorizeAttribute>();
        if (authorizeAttr == null) return;

        var user = context.HttpContext.User;
        if (!user.Identity.IsAuthenticated)
        {
            context.Result = new RedirectResult("/Error/Unauthorized");
            return;
        }
        if (!string.IsNullOrEmpty(authorizeAttr.Roles) && !user.IsInRole(authorizeAttr.Roles))
        {
            context.Result = new RedirectResult("/Error/Unauthorized");
            return;
        }
    }

    public Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
    {
        return next();
    }
}

关键注意事项

  • 确保/Error/Unauthorized页面未添加[Authorize]特性,避免循环重定向。
  • 中间件注册顺序必须正确:UseRouting之后依次注册UseAuthentication、UseAuthorization,最后注册UseEndpoints。

内容的提问来源于stack exchange,提问作者Legion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:00:56