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

app.UseWhen()无法按认证状态管控端点,求原因及条件化实现方案

问题原因分析

你用UseWhen的方式之所以无效,核心问题在于:UseWhen是用来分支中间件执行管道的,而端点路由(比如MapGet)是在应用启动阶段就全局注册完成的,和UseWhen的运行时条件完全无关。

也就是说,不管用户是否认证,/User端点已经被注册到路由系统里了,未认证用户发起请求时,路由系统能找到这个端点,自然就能访问并获取返回值。

正确实现方式

根据你的需求(基于认证状态、角色、声明等条件控制端点访问),推荐以下两种方案:

方案1:使用授权策略(官方推荐,符合最佳实践)

这是ASP.NET Core控制端点访问的标准方式,不仅能限制未认证用户,还能轻松扩展到角色、自定义声明等复杂条件。

基础认证控制

先确保项目已添加授权服务,然后给端点添加授权要求:

// 程序启动时注册授权服务
builder.Services.AddAuthorization();

// 注册端点时添加授权约束
app.MapGet("/User", (HttpContext context) => 
    Json(context.User.Identity, new JsonSerializerOptions()
    {
        ReferenceHandler = ReferenceHandler.Preserve,
        WriteIndented = true
    }))
.RequireAuthorization(); // 要求用户必须认证才能访问

未认证用户访问时会返回401 Unauthorized,这是符合HTTP规范的行为,比返回404更合理。

细粒度权限控制(角色/声明)

如果需要基于角色、特定声明筛选用户,可以先定义授权策略,再绑定到端点:

// 注册自定义授权策略
builder.Services.AddAuthorization(options =>
{
    // 要求用户拥有Admin角色
    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
    
    // 要求用户拥有指定声明及对应值
    options.AddPolicy("HasVipClaim", policy => policy.RequireClaim("UserType", "VIP"));
});

// 绑定策略到端点
app.MapGet("/AdminDashboard", () => "管理员专属内容")
.RequireAuthorization("AdminOnly");

app.MapGet("/VipContent", () => "VIP用户专属内容")
.RequireAuthorization("HasVipClaim");

方案2:实现“端点不存在”效果(返回404)

如果确实需要让未认证用户看不到该端点(返回404),可以通过中间件在运行时拦截请求:

// 注册拦截中间件,放在端点注册之前
app.Use(async (context, next) =>
{
    // 判断请求路径是/User且用户未认证
    if (context.Request.Path.Equals("/User", StringComparison.OrdinalIgnoreCase) 
        && !context.User.Identity?.IsAuthenticated ?? false)
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return;
    }
    await next();
});

// 正常注册端点
app.MapGet("/User", (HttpContext context) => 
    Json(context.User.Identity, new JsonSerializerOptions()
    {
        ReferenceHandler = ReferenceHandler.Preserve,
        WriteIndented = true
    }));

这种方式需要手动维护路径匹配,不如授权策略优雅,仅在特殊场景下使用。

总结
  • 不要用UseWhen控制端点注册,它只负责中间件流程分支,不影响路由系统的端点注册逻辑。
  • 优先使用RequireAuthorization系列方法,这是官方推荐的权限控制方案,能覆盖绝大多数身份验证、授权场景。
  • 若需实现“端点不存在”的效果,可通过前置中间件拦截请求返回404。

内容的提问来源于stack exchange,提问作者Wim ten Brink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:05:27