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

如何在ASP.NET自定义中间件中验证已配置的认证授权?

自定义中间件中实现认证授权的解决方案

MVC与Minimal API的认证授权逻辑

MVC和Minimal API的认证授权是靠管道里的两个核心中间件自动处理的:

  • 认证环节:UseAuthentication会自动扫描请求里的凭证(比如JWT的Authorization头),匹配你用AddJwtBearer/AddScheme配置的认证方案,解析出用户身份后写入HttpContext.User。
  • 授权环节:UseAuthorization会根据路由上的授权标记(MVC的[Authorize]特性、Minimal API的RequireAuthorization()),自动校验当前用户是否符合你定义的策略(比如AddPolicy配置的权限规则),不符合就直接返回401或403。

自定义中间件里手动实现认证授权

1. 手动触发认证

默认的UseAuthentication是自动触发认证,但自定义中间件里你得主动调用认证服务来完成身份解析。核心是注入IAuthenticationService:

public async Task InvokeAsync(HttpContext context, IAuthenticationService authService)
{
    // 根据请求路径选对应的认证方案(和你AddJwtBearer/AddScheme里的名字对应)
    var targetScheme = context.Request.Path.StartsWithSegments("/api/v1") ? "JwtSchemeV1" : "JwtSchemeV2";
    
    // 触发认证流程
    var authResult = await authService.AuthenticateAsync(context, targetScheme);
    
    if (authResult.Succeeded)
    {
        // 把认证通过的用户信息赋值给HttpContext.User
        context.User = authResult.Principal;
    }
    else
    {
        // 认证失败直接返回401
        context.Response.StatusCode = StatusCodes.Status401Unauthorized;
        await context.Response.WriteAsJsonAsync(new { Message = "身份验证失败" });
        return;
    }
    
    // 继续执行后续中间件或你的请求处理逻辑
    await _next(context);
}

2. 手动校验授权策略

认证通过后,用IAuthorizationService来校验你配置的策略:

public async Task InvokeAsync(HttpContext context, IAuthenticationService authService, IAuthorizationService authorizationService)
{
    // 先完成上面的认证步骤...
    
    // 根据路径选要应用的策略(和你AddPolicy里的名字对应)
    var targetPolicy = context.Request.Path.StartsWithSegments("/api/admin") ? "AdminOnly" : "NormalUser";
    
    // 校验当前用户是否符合策略要求
    var authzResult = await authorizationService.AuthorizeAsync(context.User, null, targetPolicy);
    
    if (!authzResult.Succeeded)
    {
        // 授权失败返回403
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        await context.Response.WriteAsJsonAsync(new { Message = "无访问权限" });
        return;
    }
    
    // 继续处理请求
    await _next(context);
}

3. 管道顺序的注意点

  • 如果你完全手动处理认证授权,甚至可以不用注册UseAuthentication和UseAuthorization中间件,直接在自定义中间件里调用两个服务就行。
  • 如果还要保留默认中间件的逻辑,注意把你的自定义中间件放在UseAuthentication之后?不需要——因为你是手动触发认证,顺序可以灵活调整,但如果有其他中间件依赖HttpContext.User,要确保你的认证逻辑在那些中间件之前执行。

4. 多认证方案的处理

如果需要同时支持多个认证方案(比如同时检查JWT和Cookie),可以传入多个方案名让认证服务逐一尝试:

var authResult = await authService.AuthenticateAsync(context, new[] { "JwtScheme", "CookieScheme" });
// 只要有一个方案认证成功,authResult.Succeeded就为true

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:12:54