From 18e10a004f66a220099e3dd5f5ee4fc680288152 Mon Sep 17 00:00:00 2001 From: wanghu Date: Fri, 4 Sep 2026 13:49:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=BB=E9=99=A4ticket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Auth/Cas/CasAuthenticationHandler.cs | 26 ++++--------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/YhCore.WebApi/Auth/Cas/CasAuthenticationHandler.cs b/src/YhCore.WebApi/Auth/Cas/CasAuthenticationHandler.cs index c39c325..1106e16 100644 --- a/src/YhCore.WebApi/Auth/Cas/CasAuthenticationHandler.cs +++ b/src/YhCore.WebApi/Auth/Cas/CasAuthenticationHandler.cs @@ -28,8 +28,7 @@ namespace YhCore.WebApi.Auth /// 调 /serviceValidate 校验(service 即登录时的原访问 URL,含分号段则一并重建,CAS 在末尾追加 /// ?ticket=/&ticket= 回跳)。成功后写入 Cookie 登录态并 302 到分号段 redirectToReferer(hex 解码, /// 当前形态)/ query redirectToReferer(旧 query 形态兼容)/ returnUrl(更早中继形态兼容)/ - /// 原 URL 去 ticket 版(无回跳目标);显式回跳目标(白名单通过)302 时透传一次性 ticket - /// (目标已有 query 用 &ticket=,否则 ?ticket=——按联调约定供目标页作登录完成信号)。 +/// 原 URL 去 ticket 版(无回跳目标);回跳目标 302 为纯解码地址,不追加任何参数。 /// /// public class CasAuthenticationHandler : AuthenticationHandler @@ -179,7 +178,7 @@ namespace YhCore.WebApi.Auth // 1. 已有 Cookie 登录态直接放行。 // 例外:已登录状态下又收到带 ticket 的 CAS 回调(刷新/复用回调地址、自动登录型 CAS 对同一 // service 重复签发)——票据对该会话已无意义(且常已被消费),不重走验票;若带回跳分号段则 - // 直接 302 到「解码地址 + ?ticket=」,避免落入 MVC 路由 404。Context.User 手动同步: + // 直接 302 到解码地址,避免落入 MVC 路由 404。Context.User 手动同步: // NoResult 返回时 AuthenticationMiddleware 不会赋值,SsoProtectionMiddleware 需据此识别已认证。 var cookieResult = await Context.AuthenticateAsync(YhCasDefaults.CookieScheme); if (cookieResult.Succeeded && cookieResult.Principal != null) @@ -189,7 +188,7 @@ namespace YhCore.WebApi.Auth if (!string.IsNullOrEmpty(revisitTicket) && CasHex.IsAllowedRedirectTarget(revisitReferer, AllowedHost())) { Context.User = cookieResult.Principal; - Response.Redirect(AppendTicket(revisitReferer, revisitTicket)); + Response.Redirect(revisitReferer); return AuthenticateResult.NoResult(); } return AuthenticateResult.Success(cookieResult.Ticket!); @@ -243,8 +242,8 @@ namespace YhCore.WebApi.Auth // 4. 都没有(service=纯净原访问 URL 的 notice 形态:CAS 在 service 后追加 ?ticket= 回跳, // 本请求 Path + 除 ticket 外 query 即登录时原 URL)→ 302 去掉一次性 ticket 落回原地址。 // 允许本地相对路径或同源完整 http(s) URL;非法(外站 host / 协议相对等)回根路径,防开放重定向。 - // 显式回跳目标(1/2/3)白名单通过时透传一次性票据:目标页按联调约定可凭 ticket 自证登录成功—— - // 注意票据已被本次 /serviceValidate 消费(一次性),目标侧不得再拿去 CAS 校验,仅作登录完成信号。 + // 回跳目标 302 即为纯解码地址(不追加 ticket 等任何参数)——票据已在本次 /serviceValidate + // 消费(一次性),登录态由 Cookie 承载,前端页自行调用户接口感知登录即可。 var referer = ResolveRedirectToReferer() ?? ResolveQueryRedirectToReferer() ?? ResolveReturnUrl(); @@ -252,10 +251,6 @@ namespace YhCore.WebApi.Auth if (referer != null) { redirect = CasHex.IsAllowedRedirectTarget(referer, AllowedHost()) ? referer : "/"; - if (redirect == referer) - { - redirect = AppendTicket(redirect, ticketValue); - } } else { @@ -266,17 +261,6 @@ namespace YhCore.WebApi.Auth return AuthenticateResult.NoResult(); } - /// 给回跳目标追加一次性票据(目标已有 query 用 &,否则用 ?)。 - private static string AppendTicket(string url, string ticket) - { - if (string.IsNullOrEmpty(ticket)) - { - return url; - } - return url + (url.IndexOf('?') < 0 ? "?" : "&") - + "ticket=" + Uri.EscapeDataString(ticket); - } - /// /// 解析 ;redirectToReferer= 分号段的回跳目标:优先 PathMatrixSegmentMiddleware 存入 Items 的 /// hex(分号段已从路由路径剥离,回调重建 service 仍用原始路径);未经过该中间件时回退解析当前