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

如何在ASP.NET Core 6/7 Web API开发环境中禁用身份验证与授权

ASP.NET Core MVC + Identity 身份验证实现(无需修改控制器或注释特性)

我正在使用ASP.NET Core MVC + Identity实现身份验证,不想通过注释UseAuthentication或者控制器上的[Authorize]特性调整逻辑,希望找到无需修改控制器代码、不用添加注释的实现方式。

当前代码情况

控制器代码

[Route("api/[controller]")]
[ApiController]
// [Authorize]
public class UserController : ControllerBase
{
    [HttpGet()]
    //[Authorize(Roles = "Administrator")]
    public async Task<ActionResult<List<UserGetResponseDto>>> GetMany()
    {
        return Ok(await _mediator.Send(new UserGetManyRequest()));
    }
}

Identity服务注册代码

public static IServiceCollection ConfigureIdentityServices(this IServiceCollection services, IConfiguration configuration)
{
    // ...其他身份相关服务注册代码
    services.AddAuthentication(options =>
          {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
          })
              .AddJwtBearer(o =>
              {
                o.TokenValidationParameters = new TokenValidationParameters
                {
                  ValidateIssuerSigningKey = true,
                  ValidateIssuer = true,
                  ValidateAudience = true,
                  ValidateLifetime = true,
                  ClockSkew = TimeSpan.Zero,
                  ValidIssuer = configuration["JwtSettings:Issuer"],
                  ValidAudience = configuration["JwtSettings:Audience"],
                  IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JwtSettings:Key"]))
                };
              });
    // ...其他代码
}

Program.cs现状

//app.UseAuthorization();     

注:UseAuthentication已由ConfigureIdentityServices方法处理,需要.NET 7下的可行实现方案。


解决方案(无需修改控制器或注释特性)

1. 修正中间件顺序与启用状态

services.AddAuthentication仅完成服务注册,必须在请求管道中启用身份验证和授权中间件,且顺序不能错:

// 先启用身份验证中间件(确保在授权之前)
app.UseAuthentication();
// 启用授权中间件(取消注释原有代码)
app.UseAuthorization();

中间件顺序规则:UseAuthentication → UseAuthorization → 后续业务中间件,顺序错误会导致授权逻辑失效。

2. 配置全局授权策略

通过全局策略替代控制器上的[Authorize]特性,默认要求所有接口必须认证:

services.AddAuthorization(options =>
{
    // 设置默认授权策略:要求用户已认证
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();

    // 自定义角色策略:仅允许管理员访问
    options.AddPolicy("AdministratorOnly", policy =>
        policy.RequireRole("Administrator"));
});

如果有个别接口需要匿名访问,只需在对应Action上添加[AllowAnonymous](无需修改原有控制器的注释)。

3. 端点路由级别的授权配置

如果不想全局启用,可针对特定路由/控制器配置授权规则,无需修改控制器代码:

// 所有API控制器默认要求授权
app.MapControllers().RequireAuthorization();

// 给UserController的GetMany方法单独配置管理员权限
app.MapControllerRoute(
    name: "UserGetMany",
    pattern: "api/User",
    defaults: new { controller = "User", action = "GetMany" })
    .RequireAuthorization("AdministratorOnly");

4. 验证JWT配置正确性

确保appsettings.json中的JWT参数配置正确,避免因验证失败导致授权不生效:

"JwtSettings": {
    "Issuer": "YourCustomIssuer",
    "Audience": "YourCustomAudience",
    "Key": "YourSecureSecretKeyWithAtLeast16Characters"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:28:09