Asp.Net Core 3+ [Authorize]特性自定义未授权重定向配置
Asp.Net Core 3.1 自定义授权未授权跳转路径配置方案
核心原理
Asp.Net Core 3.1中使用AddDefaultIdentity接入身份认证时,框架默认使用Identity.ApplicationCookie作为登录态存储方案,该方案默认将未授权请求重定向到Identity脚手架生成的/Identity/Account/SignIn Razor页面。跳转路径的配置不会随旧版本的通用Cookie配置项生效,必须单独对Identity注册的应用Cookie参数做覆盖。
具体调整步骤
1. 覆盖Identity Cookie的默认跳转路径
在ConfigureServices方法中,对原有AddDefaultIdentity的链式调用追加ConfigureApplicationCookie配置,修改登录、权限不足的跳转路径为业务自定义地址:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDefaultIdentity<AgentUser>(options => options.SignIn.RequireConfirmedAccount = false) .AddEntityFrameworkStores<ApplicationDbContext>() // 新增:覆盖Identity应用Cookie的默认配置 .ConfigureApplicationCookie(options => { // 自定义未授权访问的跳转目标 options.LoginPath = "/Account/SignIn"; // 可选:自定义权限校验不通过的跳转目标 options.AccessDeniedPath = "/Account/AccessDenied"; }); services.AddControllersWithViews(); // 未启用Razor Pages时保持注释即可 //services.AddRazorPages(); }
2. 清理冗余的路由配置
如果项目未使用Identity自带的Razor页面,需要在Configure方法的端点配置中移除冗余的Razor Pages路由映射,避免路由匹配冲突:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); // HSTS默认值为30天,生产环境可根据实际场景调整 app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); // 移除冗余的Razor Pages映射,未使用时不会产生实际路由 // endpoints.MapRazorPages(); }); }
注意避坑
- 自定义的
Account/SignIn登录动作必须标记[AllowAnonymous]特性,否则未登录用户访问登录页时会被认证中间件拦截,陷入无限重定向循环。参考写法:
public class AccountController : Controller { [AllowAnonymous] public IActionResult SignIn(string returnUrl = null) { // 登录页业务逻辑 } }
- 不要单独在
AddAuthentication().AddCookie()中配置跳转路径,该方案会被Identity注册的默认认证方案覆盖,配置不生效。 - 配置完成后可直接访问带
[Authorize]标记的AgentController动作,验证未登录时是否自动跳转到自定义的登录地址。
内容的提问来源于stack exchange,提问作者Cody Popham
相关产品推荐
相关产品推荐

