下面是这种情况,用户从我们的Web应用程序开辟了非安全的网页,我们称之为网页A,在他们的浏览器,然后单击在那里他们带到网页B的安全实例的链接。 一旦在网页B的用户随后可以点击一个链接,将他们带回网页A的安全实例(他们已经看到,是的OutputCache)。 我观察到,即使正在通过访问网页B之后不同的URL访问网页A(安全的)它的实际拉动之前缓存的副本,而制作成新的。 我在调试会话验证这一行为,并感到惊讶的是ASP.Net使用了相同的OutputCache项目的页面的一个安全副本。
我的问题是为什么会这样? 我如何告诉ASP.Net的输出缓存来治疗从安全的URL访问作为比非安全相当于一个不同的/唯一的项目?
[背景]
最近,我们交换我们的网站上的图像使用Scene7 / Akamai的所有图像。 作为这样的结果,我们的安全连接上观看一个给定的页面时添加的代码使用不同的Scene7的URL。 这个问题的OutputCache不会允许输出,安全网址的执行逻辑,并造成难看的浏览器警告。
我认为,你可以做一个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://”为Scene7 URL可以改变他们计划相对的URL。
<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />
这将导致浏览器自动请求用相同的方案作为参考页面资源。 这是假设你有当然您scene7域的SSL证书。
我从来没有尝试过,但你也许可以使用输出缓存VaryByHeader属性和“主持人”标头,指定所请求的资源的Internet主机和端口号。
我有现在的问题是你为什么重定向到网页A上的网页B的安全之后。 如果它是一个非安全页,无法修复你的网页B重定向总是重定向到非安全。