Подтвердить что ты не робот

Как настроить ASP.NET OutputCache в зависимости от http vs https?

Вот сценарий, пользователь открывает незащищенную страницу из нашего WebApp, позвонив ему в PageA, в свой браузер, а затем щелкнет ссылку там, которая приведет их к безопасному экземпляру PageB. Как только в PageB пользователь может впоследствии щелкнуть ссылку, которая вернет их обратно в защищенный экземпляр страницы (которая уже просматривается и находится в OutputCache). Я заметил, что даже несмотря на то, что при обращении к PageB (защищенному) страница PageA обращается по другому URL-адресу, он фактически вытаскивает предыдущую кешированную копию, а делает ее более свежей. Я проверил это поведение в сеансе отладки и был удивлен тем, что ASP.Net использовал один и тот же элемент OutputCache для безопасной копии страницы.

Мой вопрос: почему так? И как я могу указать ASP.Net OutPutCache для обработки доступа с защищенного URL в качестве другого/уникального элемента, чем небезопасный эквивалент?

[Фон]

Недавно мы переключили изображения веб-сайтов на использование Scene7/Akamai для всех изображений. В результате этого мы добавили код, чтобы использовать другой URL Scene7 при просмотре данной страницы в безопасном соединении. Эта проблема OutputCache не позволяет логике, которая выводит защищенный url для выполнения, и приводит к уродливым предупреждениям браузера.

4b9b3361

Ответ 1

Я думаю, что вы можете сделать схему 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);
    }

Ответ 2

Это не отвечает на вопрос как сформулированный, но может исключить вашу необходимость варьироваться по схеме. Если вы жестко кодируете "http://" для URL-адресов Scene7, вы можете изменить их на URL-адреса, относящиеся к схеме.

<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />

Это заставит браузер автоматически запрашивать ресурс с той же схемой, что и ссылочная страница. Предположим, что у вас есть сертификат SSL для вашего сайта scene7, конечно.

Ответ 3

Я никогда не пробовал, но вы могли бы использовать свойство Outputcache VaryByHeader и заголовок "host", в котором указывается номер хоста Интернета и номер порта запрашиваемого ресурса.

Вопрос, который у меня есть, - это то, почему вы перенаправляетесь на страницу PageA через безопасную страницу после PageB. Если это небезопасная страница, вы не можете исправить перенаправление PageBB, чтобы всегда перенаправлять на небезопасные.