去除ticket
build / build-push (push) Successful in 1m17s

This commit is contained in:
wanghu
2026-09-04 13:49:11 +08:00
parent a73fb4a214
commit 18e10a004f
@@ -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 用 &amp;ticket=,否则 ?ticket=——按联调约定供目标页作登录完成信号)。</item>
/// 原 URL 去 ticket 版(无回跳目标);回跳目标 302 为纯解码地址,不追加任何参数。</item>
/// </list>
/// </summary>
public class CasAuthenticationHandler : AuthenticationHandler<CasAuthenticationOptions>
@@ -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();
}
/// <summary>给回跳目标追加一次性票据(目标已有 query 用 &amp;,否则用 ?)。</summary>
private static string AppendTicket(string url, string ticket)
{
if (string.IsNullOrEmpty(ticket))
{
return url;
}
return url + (url.IndexOf('?') < 0 ? "?" : "&")
+ "ticket=" + Uri.EscapeDataString(ticket);
}
/// <summary>
/// 解析 ;redirectToReferer= 分号段的回跳目标:优先 PathMatrixSegmentMiddleware 存入 Items 的
/// hex(分号段已从路由路径剥离,回调重建 service 仍用原始路径);未经过该中间件时回退解析当前