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

如何在开发环境中关闭基于JWT的授权与认证功能?

如何在开发环境中关闭基于JWT的授权与认证功能?

嗨,我来帮你搞定这个问题!你现在想在开发环境里绕开JWT的认证授权,只在生产环境启用对吧?其实利用ASP.NET Core自带的环境判断功能就能轻松实现,给你几个实用的方案:


方案一:在Program.cs中根据环境条件注册服务

最直接的方式就是在启动时判断当前环境,只有非开发环境才注册JWT认证授权服务,开发环境则注册一个“假”的认证逻辑来跳过校验:

var env = builder.Environment;

if (!env.IsDevelopment())
{
    // 生产/测试环境正常注册JWT认证授权
    builder.Services.AddJwtAuthentication(builder.Configuration);
}
else
{
    // 开发环境:注册一个极简的认证Handler,直接通过所有认证
    builder.Services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = "DevScheme";
        options.DefaultChallengeScheme = "DevScheme";
    }).AddScheme<AuthenticationSchemeOptions, DevAuthenticationHandler>("DevScheme", null);
    
    // 开发环境默认允许所有请求匿名访问
    builder.Services.AddAuthorization(options =>
    {
        options.FallbackPolicy = new AuthorizationPolicyBuilder()
            .AllowAnonymous()
            .Build();
    });
}

对应的极简开发环境认证Handler实现(可以放在项目的工具类文件夹里):

public class DevAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public DevAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
        : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // 开发环境直接构造一个默认用户身份,跳过真实认证
        var claims = new[] { new Claim(ClaimTypes.Name, "Dev_Admin") };
        var identity = new ClaimsIdentity(claims, Scheme.Name);
        var principal = new ClaimsPrincipal(identity);
        var ticket = new AuthenticationTicket(principal, Scheme.Name);
        
        return Task.FromResult(AuthenticateResult.Success(ticket));
    }
}

方案二:开发环境全局添加匿名访问过滤器

如果不想写自定义认证Handler,还可以直接在开发环境给所有控制器添加全局匿名过滤器,强制跳过所有[Authorize]检查:

var env = builder.Environment;

if (env.IsDevelopment())
{
    // 开发环境:全局允许所有请求匿名访问
    builder.Services.AddControllers(options =>
    {
        options.Filters.Add(new AllowAnonymousFilter());
    });
    
    // 注册一个空的认证Scheme避免启动报错
    builder.Services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = "DevScheme";
    }).AddScheme<AuthenticationSchemeOptions, DevDummyAuthenticationHandler>("DevScheme", null);
}
else
{
    // 非开发环境正常启用JWT认证授权
    builder.Services.AddJwtAuthentication(builder.Configuration);
    builder.Services.AddControllers();
}

// 对应的极简空Handler
public class DevDummyAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public DevDummyAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, 
        ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) 
        : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // 直接返回成功,不需要构造真实用户信息(如果业务不需要的话)
        return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(new ClaimsPrincipal(), Scheme.Name)));
    }
}

方案三:修改现有扩展方法内置环境判断

如果你想把逻辑封装到现有的AddJwtAuthentication扩展方法里,只需要给方法加上环境参数,内部做判断即可:

public static void AddJwtAuthentication(this IServiceCollection services, IConfiguration configuration, IWebHostEnvironment env)
{
    if (!env.IsDevelopment())
    {
        // 非开发环境保留原有JWT认证逻辑
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(x =>
        {
            JWTOptions jwtOption = new JWTOptions();
            configuration.GetSection(nameof(JWTOptions)).Bind(jwtOption);

            x.SaveToken = true;

            var key = Encoding.UTF8.GetBytes(jwtOption.SecretKey);
            x.TokenValidationParameters = new TokenValidationParameters
            {
                // 你的原有配置...
            };
        });

        services.AddAuthorization();
    }
    else
    {
        // 开发环境使用匿名授权+极简认证
        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = "DevScheme";
            options.DefaultChallengeScheme = "DevScheme";
        }).AddScheme<AuthenticationSchemeOptions, DevAuthenticationHandler>("DevScheme", null);
        
        services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .AllowAnonymous()
                .Build();
        });
    }
}

然后在Program.cs里调用时传入环境:

builder.Services.AddJwtAuthentication(builder.Configuration, builder.Environment);

这些方案都能让你在开发环境下彻底跳过JWT的认证授权校验,同时不影响生产环境的正常功能,选你觉得最顺手的就行~

备注:内容来源于stack exchange,提问作者Panda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 11:05:32