Asp.net core 3.1强制密码修改中间件跳转后返回原路径问题求解
问题根源
你当前的中间件逻辑存在执行分支缺失:当已登录且需要修改密码的用户访问MustChangePassword/ResetPassword页面时,代码没有执行_next(context)将请求传递给后续管道(即Controller/Action处理逻辑),也没有正常终止请求,导致重定向到修改密码页后请求管道异常中断,触发自动回跳。同时现有逻辑未排除静态资源路径,会导致修改密码页的样式、脚本资源加载被拦截重定向。
修复步骤
1. 修正中间件InvokeAsync逻辑
调整分支判断规则,所有不需要重定向的场景统一将请求交给后续管道处理:
public async Task InvokeAsync(HttpContext context, UserManager<User> userManager) { var crtUser = await userManager.GetUserAsync(context.User); // 仅对已登录、且需要强制修改密码的用户做校验 if (crtUser != null && crtUser.MustChangePassword == true) { string requestURL = context.Request.Path.ToString().ToLower(); // 排除修改密码相关路径+静态资源路径,避免页面样式、脚本加载失败 if (!requestURL.Contains("mustchangepassword") && !requestURL.Contains("resetpassword") && !requestURL.Contains("/lib/") && !requestURL.Contains("/css/") && !requestURL.Contains("/js/")) { var returnUrl = context.Request.Path.Value == "/" ? "" : "?returnUrl=" + HttpUtility.UrlEncode(context.Request.Path.Value); context.Response.Redirect("/Home/MustChangePassword"+returnUrl ,true); // 重定向后直接返回,不继续走后续管道 return; } } // 所有不需要重定向的场景,统一交给后续管道处理 await _next(context).ConfigureAwait(false); }
2. 调整中间件注册顺序
必须将密码校验中间件放在身份认证中间件之后、端点路由中间件之前,确保能正常读取到已登录用户的信息:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 前置中间件:异常处理、静态资源、路由等 app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 先执行身份认证,才能拿到context.User信息 app.UseAuthentication(); app.UseAuthorization(); // 身份认证完成后再注册密码校验中间件 app.UseMustChangePassword(); // 最后注册端点路由 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
3. 补充密码提交逻辑校验
密码修改成功后,务必将数据库中对应用户的MustChangePassword标记设置为false,否则提交后仍会被重定向回修改密码页。
内容的提问来源于stack exchange,提问作者Daniel.C. A.
相关产品推荐
相关产品推荐

