ASP.NET внедряет состояние сеанса в URL, несмотря на параметр "UseCookies"
В моем приложении 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(
и всегда заканчивается ))
а все остальные символы - латинские буквы в верхнем и нижнем регистре и цифры, разделенные случайными черточками и подчеркиваниями, помещенными без каких-либо очевидных правил. Кроме того, это выглядит совершенно случайно.
После долгих поисков я почти уверен, что странно выглядящая строка - это состояние сеанса 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()
внезапно внедрить какую-то случайно выглядящую строку, похожую на закодированное состояние сеанса, в цель перенаправления?
1 ответ
Оказывается, есть две совершенно разные настройки - одна из system.web/sessionState
а другой из system.web/authentication/forms/cookieless
и они имеют разные значения по умолчанию. Последний имеет UseDeviceProfile
по умолчанию, поэтому он иногда вставляет маркер проверки подлинности с помощью форм в URL.
В нашем случае такая конфигурация не имела смысла - если у пользователя нет поддержки куки, он не может использовать наш сайт, потому что он сильно зависит от куки, поэтому мы просто меняем system.web/authentication/forms/cookieless
в UseCookies
,