在我的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日志中的请求来自外部世界,代码400失败(糟糕的请求)。
我不想在这里发布随机字符串,因为我不确定它是否揭示了任何敏感数据。它每次都包含相同数量的字符,总是以(F(开头,总是以))结尾,所有其他字符都是大写和小写拉丁字符和数字,用偶发的破折号和下划线分隔,没有任何明显的规则。除此之外,它看起来完全是随机的。
经过大量的搜索,我很确定奇怪的字符串是以“无炊具”的方式发送给客户端的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()会突然向重定向目标注入一些类似于编码会话状态的随机字符串?
发布于 2013-09-02 10:31:16
原来有两个完全不同的设置--一个来自system.web/sessionState,另一个来自system.web/authentication/forms/cookieless和have different values by default。后者默认具有UseDeviceProfile,因此有时会将表单身份验证令牌插入到URL中。
在我们的例子中,这种配置是没有意义的--如果用户没有cookies支持,他就不能使用我们的站点,因为它严重依赖cookies,所以我们只是将system.web/authentication/forms/cookieless改为UseCookies。
https://stackoverflow.com/questions/18329994
复制相似问题