2009-07-14 6 views
14

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

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

[Фон]

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

ответ

8

Я думаю, что вы можете сделать VaryByCustom = «схему» и добавить в файл Global.asax.cs (inlcuding пару других другие, которые я использую, а приложение пользователя версия &):

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); 
    } 
+0

+1. Именно то, что мне нужно. В моем случае пользователь не должен переходить на HTTPS для моей конкретной страницы. Но в случае, если они это сделают, у меня есть код перенаправления, чтобы отправить их на HTTP. Однако этот код перенаправления не будет работать, пока я не изменюсь по «схеме», как в вашем примере. –

1

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

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

+0

+1 Спасибо за ответ. Мой пример намного проще, чем моя реальность. На самом деле, у меня много страниц и многих страниц. Чтобы изменить все ссылки на страницуA как небезопасные с pageB, было бы слишком много работы, я надеюсь, что есть более простой способ. – James

13

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

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

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

+1

+1 - Интересно, я не понимал, что это возможно. – James

+1

+1 - сделал бы больше, если бы мог ... это должно быть отмечено как ответ. – caryden

+1

Однако избегайте использования протоколов для CSS в IE: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/ –