Как настроить ASP.Net OutputCache, чтобы он варьировался в зависимости от http против https?
Вот сценарий: пользователь открывает незащищенную страницу из нашего WebApp, назовем ее PageA, в своем браузере, а затем щелкает там ссылку, которая приводит его к защищенному экземпляру PageB. Попав в PageB, пользователь может впоследствии щелкнуть ссылку, которая возвращает его к безопасному экземпляру PageA (который он уже просматривал и находится в OutputCache). Я заметил, что даже несмотря на то, что после посещения PageB (защищенного) доступ к PageA осуществляется по другому URL-адресу, на самом деле он вытягивает предыдущую кэшированную копию, а делает новую. Я проверил это поведение в сеансе отладки и был удивлен, что ASP.Net использовал тот же элемент OutputCache для безопасной копии страницы.
Мой вопрос, почему это так? И как я могу сказать ASP.Net OutPutCache рассматривать доступ с защищенного URL-адреса как другой / уникальный элемент, чем незащищенный эквивалент?
[Фон]
Недавно мы переключили изображения наших веб-сайтов на использование Scene7/Akamai для всех изображений. В результате мы добавили код для использования разных URL-адресов Scene7 при просмотре данной страницы по безопасному соединению. Эта проблема OutputCache не допускает выполнения логики, которая выводит защищенные URL, и приводит к появлению уродливых предупреждений браузера.
3 ответа
Я думаю, что вы можете сделать схему VaryByCustom="и добавить ее в свой файл Global.asax.cs (включая пару других, которые я использую, а также версию приложения и пользователя):
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom.Equals("version", StringComparison.CurrentCultureIgnoreCase))
{
Assembly asm = Assembly.GetExecutingAssembly();
string[] parts = asm.FullName.Split(',');
string version = parts[1].Trim().ToLower();
return version;
}
else if (custom.Equals("user", StringComparison.CurrentCultureIgnoreCase))
{
var user = Membership.Users.CurrentUser;
return null == user ? string.Empty : user.Id.ToString();
}
else if (custom.Equals("scheme", StringComparison.CurrentCultureIgnoreCase))
{
var scheme = context.Request.IsSecureConnection ? "https" : "http";
return scheme;
}
else
return base.GetVaryByCustomString(context, custom);
}
Это не отвечает на вопрос в том виде, в каком оно сформулировано, но может устранить необходимость в изменении схемы. Если вы жестко кодируете "http://" для URL-адресов Scene7, вы можете изменить их на относительные к схеме URL-адреса.
<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />
Это заставит браузер автоматически запрашивать ресурс по той же схеме, что и ссылающаяся страница. Это предполагает, что у вас есть сертификат SSL для вашего домена scene7, конечно.
Я никогда не пробовал, но вы могли бы использовать свойство Outputcache VaryByHeader и заголовок "host", который определяет хост в Интернете и номер порта запрашиваемого ресурса.
Вопрос, который у меня возникнет, заключается в том, почему вы переадресовываетесь на PageA более безопасно после PageB Если это небезопасная страница, не могли бы вы исправить перенаправление PageB, чтобы всегда перенаправлять на незащищенный.