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,

Другие вопросы по тегам