ASP.NET将会话状态注入URL,尽管;使用cookies“;背景

ASP.NET将会话状态注入URL,尽管;使用cookies“;背景,.net,asp.net-mvc-3,iis,asp.net-mvc-routing,redirecttoaction,.net,Asp.net Mvc 3,Iis,Asp.net Mvc Routing,Redirecttoaction,在我的ASP.NET MVC3应用程序中,我有以下路由定义: routes.MapRoute( "Sso", "MyController/Sso", new { controller = "MyController", action="Sso" } ); routes.MapRoute( "Settings", "MyController/Settings/{objectId}", new { controller = "MyController", action="Settin

在我的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/someguid记录为预期的重定向目标。还要注意,
objectId
已正确映射,因此可以清楚地匹配正确的路线

然而,在生产中会发生以下情况。当运行
OnResultExecuted()
时,请求会记录类似于
/some-very-long-string-290-characters-long-here/MyAccount/Settings/some guid的内容作为重定向目标。看起来这就是用户接收并尝试遵循的内容-我在HTTPERR日志中看到来自外部世界的对此URL的请求,但失败代码为400(错误请求)

我不想在这里发布随机字符串,因为我不确定它是否会显示任何敏感数据。它每次都包含相同数量的字符,总是以
(F(
,总是以
)结尾)
开头,而所有其他字符都是大写和小写的拉丁字符,数字之间偶尔用破折号和下划线隔开,没有任何明显的规则。除此之外,它看起来完全是随机的

经过大量的搜索,我很确定这个奇怪的字符串是以“无cookieless”的方式发送给客户端的ASP.NET会话状态。因此,我在我的应用程序中检查了它
System.Web.HttpSessionStateBase.CookieMode
返回
UseCookies
System.Web.HttpSessionStateBase.iscookeeless
返回
false
,还返回
(System.Web.Configuration.sessionstatessection)System.Web.configurationmanager.GetSection(“system.web/sessionState”).Cookieeless
返回
UseCookies
。因此,我或多或少确信ASP.NET已配置为将会话状态作为Cookie返回,而不管客户端喜欢什么


为什么
会重定向到action()
突然将一些类似于编码会话状态的随机字符串注入重定向目标?

结果是有两个完全不同的设置-一个来自
system.web/sessionState
,另一个来自
system.web/authentication/forms/cookieless
,后者有
UseDeviceProfile
>默认情况下,它有时会将表单身份验证令牌注入URL


在我们的例子中,这种配置毫无意义-如果用户没有cookies支持,他就不能使用我们的网站,因为它严重依赖cookies,所以我们只是将
system.web/authentication/forms/cookieless
更改为
UseCookies

,是否这些客户端不接受您的表单验证cookie票据,所以.NET将加密的cookie值放入URL很像无cookie会话标识符。如果在禁用所有第三方cookie的情况下从浏览器中点击该URL,会发生什么情况?@Tommy:AFAIK
sessionState
中有
cookie
参数,它是“无论客户端说什么都使用cookie”“默认情况下,我不会在任何地方更改该设置。这是我见过的唯一一个导致.NET插入这样的随机字符串的情况,但是,它通常不是290个以上的字符(更像30个)。@Tommy:我认为字符串的长度将取决于会话状态中的数据量,所以290个字符并不是那么不正常。我认为它只是一个编码标识符,用于标识服务器本身上的会话ID,而不是会话数据,因为会话数据存储在服务器端?有趣的是,今天晚些时候我可能会在谷歌上找到一些东西。太棒了-很高兴你找到了答案!我不太确定,因此评论与实际答案相对应。另外,在额外的信息上做得很好,从不知道不同的默认设置。