在我的 ASP.NET MVC3 应用程序中,我有以下路由定义:
routes.MapRoute( "Sso", "MyController/Sso",
new { controller = "MyController", action="Sso" } );
routes.MapRoute( "Settings", "MyController/Settings/{objectId}",
new { controller = "MyController", action="Settings", objectId = @"" } );
在里面MyController
我有这个:
[My]
public ActionResult Sso( list of parameters )
{
//blah - nothing that would yield a redirect, then
FormsAuthentication.SetAuthCookie("MagicSso." + someGuid, false);
return RedirectToAction("Settings", new { objectId = someGuid } );
}
和MyAttribute
类继承System.Web.Mvc.ActionFilterAttribute
并覆盖OnResultExecuted()
,后者记录的值ResultExecutedContext.HttpContext.Response.RedirectLocation
。
在测试中它工作得很好,并且在OnResultExecuted()
运行时它完全按照预期记录/MyAccount/Settings/some-guid-as-expected-here
为重定向目标。另请注意,objectId
已正确映射,因此清楚地匹配了正确的路线。
但是在生产中会发生以下情况。一个请求到达https://my.domain.name/MyController/Sso并且在OnResultExecuted()
运行时它会记录类似/some-very-long-string-290-characters-long-here/MyAccount/Settings/some-guid-as-expected-here
重定向目标的内容。看起来这就是用户接收并尝试遵循的内容 - 我在 HTTPERR 日志中看到来自外部世界的对该 URL 的请求,并且失败并显示代码 400(错误请求)。
我宁愿不在这里发布随机字符串,因为我不确定它是否会泄露任何敏感数据。它每次都包含相同数量的字符,总是以开头(F(
和结尾,))
所有其他字符都是大写和小写的拉丁字符和数字,中间用破折号和下划线隔开,没有任何明显的规则。除此之外,它看起来完全随机。
经过大量搜索后,我很确定看起来怪异的字符串是以“无cookie”方式发送给客户端的ASP.NET 会话状态。所以我在我的应用程序中检查了System.Web.HttpSessionStateBase.CookieMode
返回UseCookies
和System.Web.HttpSessionStateBase.IsCookieless
返回false
以及(System.Web.Configuration.SessionStateSection)System.Web.Configuration.WebConfigurationManager.GetSection("system.web/sessionState").Cookieless
返回UseCookies
。所以我或多或少地确定 ASP.NET 被配置为将会话状态作为 cookie 返回,无论客户端喜欢什么。
为什么会RedirectToAction()
突然将一些类似于编码会话状态的随机字符串注入重定向目标?