Как настроить 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, чтобы всегда перенаправлять на незащищенный.

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