@@ -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=——按联调约定供目标页作登录完成信号)。</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 用 &,否则用 ?)。</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 仍用原始路径);未经过该中间件时回退解析当前
|
||||
|
||||
Reference in New Issue
Block a user