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

.NET 6.0中如何统一重定向未授权用户至指定页面?

解决方案:Windows身份验证下通用未授权重定向

针对Windows身份验证+Negotiate协议场景,要实现无权限用户访问带角色限制端点时的通用重定向,核心是拦截403 Forbidden状态(Windows身份验证下角色不匹配返回403而非401),以下是两种可行方案:


方案一:全局中间件拦截状态码

这是最简单的通用方案,无需修改现有授权特性,直接在请求管道末尾拦截403状态并跳转:

  1. 在Program.cs中配置完认证授权后,添加自定义中间件:
// 先配置认证授权
builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
    .AddNegotiate();
builder.Services.AddAuthorization(options =>
{
    // 保留你原有的角色策略,比如AdminOnly
    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});

// 注册中间件(注意顺序要在UseAuthorization之后)
app.UseAuthorization();

// 自定义重定向中间件
app.Use(async (context, next) =>
{
    await next();
    
    // 仅拦截视图请求的403,排除API、静态资源
    if (context.Response.StatusCode == StatusCodes.Status403Forbidden
        && !context.Request.Path.StartsWithSegments("/api")
        && !context.Request.Path.StartsWithSegments("/css")
        && !context.Request.Path.StartsWithSegments("/js"))
    {
        context.Response.Redirect("/Unauthorized");
    }
});
  1. 创建未授权页面路由:
    新增UnauthorizedController及对应视图:
public class UnauthorizedController : Controller
{
    public IActionResult Index()
    {
        return View();
    }
}

在Views/Unauthorized/Index.cshtml中编写未授权提示页面即可。


方案二:自定义授权处理器(更细粒度控制)

如果需要针对不同角色策略做不同跳转逻辑,可自定义授权处理器:

  1. 实现自定义角色授权处理器:
public class RoleAuthorizationHandler : AuthorizationHandler<RolesAuthorizationRequirement>
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public RoleAuthorizationHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, RolesAuthorizationRequirement requirement)
    {
        var httpContext = _httpContextAccessor.HttpContext;
        
        // 检查用户是否在允许的角色中
        if (!context.User.IsInAnyRole(requirement.AllowedRoles))
        {
            context.Fail();
            httpContext.Response.Redirect("/Unauthorized");
            return Task.CompletedTask;
        }

        context.Succeed(requirement);
        return Task.CompletedTask;
    }
}
  1. 在Program.cs中注册处理器并配置授权:
builder.Services.AddHttpContextAccessor();
builder.Services.AddScoped<IAuthorizationHandler, RoleAuthorizationHandler>();

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
});

关键注意事项

  • Windows身份验证场景下,角色不匹配返回403,而非401,所以不要拦截401状态码。
  • 中间件顺序必须正确:UseAuthentication() → UseAuthorization() → 自定义重定向中间件。
  • 注意排除API和静态资源的重定向,避免影响接口返回格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:09:32