如何保存用户请求的URL,在用户通过强制门户后跳转至该地址?
实现方案
核心思路是将用户原始访问路径作为查询参数携带在强制门户跳转地址中,无需提前设置Cookie即可完成路径传递,用户同意Cookie后再读取该参数完成回跳。
第一步:修改Cookie校验中间件
重定向到强制门户时,将当前请求的完整路径(含查询参数)编码后作为returnUrl参数拼接至跳转地址:
public async Task Invoke(HttpContext httpContext) { if(httpContext.Request.Cookies["MyCookie"] == null && httpContext.Request.Path != "/WhereIShouldGo") { // 编码原始路径,避免特殊字符导致解析错误 var originalPath = Uri.EscapeDataString(httpContext.Request.Path + httpContext.Request.QueryString); httpContext.Response.Redirect($"/WhereIShouldGo?returnUrl={originalPath}"); } await _next(httpContext); }
第二步:修改强制门户的同意逻辑
用户点击同意Cookie按钮时,后端先写入约定的MyCookie,再读取returnUrl参数完成跳转,注意必须校验路径为站内地址,避免开放重定向安全漏洞:
// 示例为ASP.NET Core Controller 处理逻辑 [HttpPost] public IActionResult AgreeCookie(string returnUrl) { // 写入同意Cookie,过期时间可自行设置 Response.Cookies.Append("MyCookie", "agree", new CookieOptions { Expires = DateTimeOffset.Now.AddDays(30), HttpOnly = true, Secure = true // 生产环境HTTPS下建议开启 }); // 校验returnUrl为站内路径,防止钓鱼攻击 if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(Uri.UnescapeDataString(returnUrl))) { return Redirect(Uri.UnescapeDataString(returnUrl)); } // 无有效returnUrl时跳转到首页 return RedirectToAction("Index", "Home"); }
注意事项
如果用户原始请求为POST类型,跳转回原路径时会丢失POST参数,该场景可根据业务需求选择提前在前端弹出Cookie同意提示,或跳转后提示用户重新提交操作。
内容的提问来源于stack exchange,提问作者Munchkin
相关产品推荐
相关产品推荐

