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

ASP.NET Core API将未授权请求重定向至应用商店

ASP.NET Core API 未授权请求重定向至应用商店解决方案

要实现未授权请求自动重定向到应用商店,你需要修改JWT认证的挑战逻辑,拦截默认的401响应并返回重定向。以下是具体修改步骤和完整代码:

修改要点

  • 为JWTBearer配置OnChallenge事件,在认证失败时触发重定向
  • 可根据请求的User-Agent判断设备类型,跳转至对应应用商店(也可直接固定跳转链接)
  • 确保重定向逻辑仅在非开发环境生效(避免影响Swagger调试)

修改后的完整Program.cs代码

var builder = WebApplication.CreateBuilder(args);
ConfigurationManager configuration = builder.Configuration;

builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));

builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(
  builder.Configuration.GetConnectionString("DefaultConnection")
  ));

builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

builder.Services.AddScoped<IUnitOfWork, UnitOfWork>();
builder.Services
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.SaveToken = true;
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidAudience = builder.Configuration["appsettings:Audience"],
            ValidIssuer = builder.Configuration["appsettings:Issuer"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["appsettings:Secret"]))
        };

        // 新增:处理认证挑战,返回重定向
        options.Events = new JwtBearerEvents
        {
            OnChallenge = context =>
            {
                // 跳过开发环境,避免影响Swagger调试
                if (context.HttpContext.RequestServices.GetRequiredService<IWebHostEnvironment>().IsDevelopment())
                {
                    return Task.CompletedTask;
                }

                // 取消默认的401响应
                context.HandleResponse();

                // 根据User-Agent判断设备类型,跳转对应商店
                var userAgent = context.HttpContext.Request.Headers.UserAgent.ToString().ToLower();
                string storeUrl;

                if (userAgent.Contains("android"))
                {
                    storeUrl = "https://play.google.com/store/apps/details?id=你的安卓应用包名";
                }
                else if (userAgent.Contains("iphone") || userAgent.Contains("ipad"))
                {
                    storeUrl = "https://apps.apple.com/cn/app/你的苹果应用名称/id应用ID";
                }
                else
                {
                    // 默认跳转至安卓商店或官网
                    storeUrl = "https://play.google.com/store/apps/details?id=你的安卓应用包名";
                }

                // 返回重定向响应
                context.HttpContext.Response.Redirect(storeUrl);
                return Task.CompletedTask;
            }
        };
    });

builder.Services.AddDependencies();
builder.Configuration.AddEnvironmentVariables();
var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI(c => {
        c.SupportedSubmitMethods( new Swashbuckle.AspNetCore.SwaggerUI.SubmitMethod[] { Swashbuckle.AspNetCore.SwaggerUI.SubmitMethod.Options });
    });
}

app.UseHttpsRedirection();

app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();

app.Run();

关键说明

  • OnChallenge事件:拦截JWT认证失败的挑战流程,替换默认的401响应为重定向
  • User-Agent判断:通过请求头识别设备类型,实现分平台跳转
  • 开发环境跳过:避免在调试时触发重定向,影响Swagger使用
  • 配置化优化:建议将应用商店链接存入appsettings.json,便于后续修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:10:33