1

在我的 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返回UseCookiesSystem.Web.HttpSessionStateBase.IsCookieless返回false以及(System.Web.Configuration.SessionStateSection)System.Web.Configuration.WebConfigurationManager.GetSection("system.web/sessionState").Cookieless返回UseCookies。所以我或多或少地确定 ASP.NET 被配置为将会话状态作为 cookie 返回,无论客户端喜欢什么。

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

4

1 回答 1

0

原来有两个完全独立system.web/sessionState的设置 - 一个 from 和另一个 fromsystem.web/authentication/forms/cookieless并且默认情况下它们具有不同的值。后者UseDeviceProfile默认具有,因此它有时会将表单身份验证令牌注入 URL。

在我们的例子中,这种配置没有意义——如果用户没有 cookie 支持,他就不能使用我们的网站,因为它严重依赖 cookie,所以我们只需更改system.web/authentication/forms/cookielessUseCookies.

于 2013-09-02T10:31:16.347 回答