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
相关产品推荐
相关产品推荐

