这是一个令人头疼的问题:
我有一个Dotnet应用程序,在某个非活动时间段后签署用户。使用相关CSHTML中定义的操作的JavaScript函数将用户发送到某个控制器方法,该方法将对其进行签名。
当JavaScript代码决定用户应该退出时,它会使用以下行来执行此操作:
location.href = settings.actions.expireSession + '?returnUrlString=' + currentUrl;
其中settings.actions.expireSession定义为:
expireSession: '@Url.Action("Expire", "Session")'
并且进入location.href的返回url字符串如下所示:
http://localhost:49574/Report/ReportWithUserIdAndCaseId?userId=84&caseId=173
这是正确的,整个字符串与url动作组合在一起如下所示:
"/Session/Expire?returnUrlString=http://localhost:49574/Report/ReportWithUserIdAndCaseId?userId=84&caseId=173"
我在相关方法的入口点设置了一个断点,但是在名为" returnUrlString"的字符串参数中到达了什么。缺少" caseId":
http://localhost:49574/?returnUrl=http%3A%2F%2Flocalhost%3A49574%2FReport%2FReportWithUserIdAndCaseId%3FuserId%3D84
因此,当我输入用户名和密码重新登录时,我会被重定向到以下网址:
http://localhost:49574/Report/EntrySummaryReportWithPatientIdAndVisitId?userId=84
失败,因为它错过了一个关键参数。
我错过了什么明显的东西吗?在Dotnet的寻址/重定向系统的自动化背景中是否有其他可能导致这种神秘消失的原因?
非常感谢大家阅读本文,并感谢贡献者! - 伊利亚
答案 0 :(得分:1)
您需要在将Url发送到Session / Expire页面之前将其转义。
有关在Javascript中对其进行编码的信息,请参阅此前一个问题: Encode URL in JavaScript?
一旦你的Session Expire页面上有returnUrlString,你就应该取消它并将用户引导到它。
问题是会话/过期页面的网址是:
"/Session/Expire?returnUrlString=http://localhost:49574/Report/ReportWithUserIdAndCaseId?userId=84&caseId=173"
服务器看到的是:
页面:"/Session/Expire?
,QueryString ReturnUrlString:returnUrlString=http://localhost:49574/Report/ReportWithUserIdAndCaseId?userId=84
,QueryString CaseId:&caseId=173"
它将您的& caseId解释为/ Session / Expire URL的一部分。这就是它消失的原因。