【发布时间】:2021-09-01 09:12:57
【问题描述】:
我正在使用 MVC 5。问题是 SSO 在身份验证后重定向回应用程序后,登录方法 returnUrl 删除了 applicaitonId 查询字符串参数。请帮忙!
这是流程。
-
应用将未经授权的用户重定向到登录方法,并在 returnUrl 中保留原始请求。
原来的请求是
http://localhost:25451/shared/download?documentGroup=133&applicationId=3153returnUrl 是
/shared/download?documentGroup=133&applicationId=3153 -
应用重定向到 SSO CAS 服务器,将 HttpUtility.Encode returnUrl 作为参数与登录 URL 一起作为服务参数的一部分发送。
https://{redacted}/cas/login?service=http://localhost:25451/account/login%3freturnUrl%3d%2fshared%2fdownload%3fdocumentGroup%3d133%26applicationId%3d3153 -
身份验证后,CAS 服务器附加授权票证并重定向回服务 URL。这就是提琴手所展示的。
http://localhost:25451/account/login?returnUrl=/shared/download?documentGroup=133&applicationId=3153&ticket={redacted} -
这就是问题所在。 login方法中的returnuRL很简单
/shared/download?documentGroup=133.returnUrl 不再有 applicationId。
有趣的是,这条线工作得很好。
var ticket = Request.QueryString.Get("ticket");
我尝试对整个 serviceUrl 进行编码并尝试仅对 returnUrl 进行编码(见下文),但我遇到了同样的缺少 ApplicationId 问题。
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
var ticket = Request.QueryString.Get("ticket");
if (!string.IsNullOrEmpty(ticket))
{
//verify the ticket...
return RedirectToLocal(returnUrl);
}
var serviceUrl = Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host + (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) + "/account/login" + "?returnUrl=" + HttpUtility.UrlEncode(returnUrl);
var authenCasUrl = string.Format("{0}login?service={1}", "https://{redacted}/", serviceUrl);
return Redirect(authenCasUrl);
}
【问题讨论】:
-
如果你反转两个参数 documentGroup=133&applicationId=3153 => applicationId=3153&documentGroup=133 总是第一个参数持久化?
-
感谢@B.Lec 的回复。切换变量会删除 documentId。因此,无论顺序如何,似乎都删除了第二个参数。
-
我对正在发生的事情一无所知,作为一种解决方法,您应该尝试仅使用 1 个“状态”参数并将您需要的所有值序列化为 base64 编码的 json
-
看看stackoverflow.com/questions/372865/path-combine-for-urls Flurl 支持 url.combine 处理所有 url 组合魔法。
标签: asp.net asp.net-mvc