【发布时间】:2013-08-22 04:56:17
【问题描述】:
在我的 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() 会突然向重定向目标注入一些类似于编码会话状态的随机字符串?
【问题讨论】:
-
可能是那些客户端不接受您的表单身份验证 cookie 票证,因此 .NET 将加密的 cookie 值放入 URL 中,就像无 cookie 会话标识符一样。如果您在禁用所有 3rd 方 cookie 的浏览器中点击该 URL,会发生什么情况?
-
@Tommy:AFAIK 在
sessionState中有cookieless参数,默认情况下它是“无论客户说什么都使用cookie”,我不会在任何地方更改该设置。 -
很公平 - 这是我所见过的唯一导致 .NET 注入这样的随机字符串的东西,但是,它通常不是 290 多个字符(更像是 30 个)。
-
@Tommy:我认为字符串的长度取决于会话状态下的数据量,所以290个字符并没有那么异常。
-
我认为它只是一个编码标识符来标识服务器本身的会话 ID 而不是会话数据,因为会话数据存储在服务器端?有趣的是,我今天晚些时候可能有一些事情要 Google。
标签: .net asp.net-mvc-3 iis asp.net-mvc-routing redirecttoaction