背景 + 原始问题(使用解决方法)
我有一个网站,我想在其中提供一些页面作为 HTTP 和一些作为 HTTPS。为此,我编写了一个执行以下操作的函数:
public static void ChangeRequestWithSecurity()
{
string absolutePath = HttpContext.Current.Request.Url.AbsolutePath;
if (HttpContext.Current.Request.ServerVariables["HTTPS"].Equals("on") && !IsSecure(absolutePath))
{
ErrorHandling.JustWriteToDatabase("Changing from HTTPS to HTTP: " + HttpContext.Current.Request.Url.AbsoluteUri.Replace("https://", "http://"), "DEBUG");
//Redirect to http version
HttpContext.Current.Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri.Replace("https://", "http://"));
}
else if (!HttpContext.Current.Request.ServerVariables["HTTPS"].Equals("on") && IsSecure(absolutePath))
{
ErrorHandling.JustWriteToDatabase("Changing from HTTP to HTTPS: " + HttpContext.Current.Request.Url.AbsoluteUri.Replace("http://", "https://"), "DEBUG");
//Redirect to https version
HttpContext.Current.Response.Redirect(HttpContext.Current.Request.Url.AbsoluteUri.Replace("http://", "https://"));
}
else ErrorHandling.JustWriteToDatabase("Got correct Path: " + HttpContext.Current.Request.Url.AbsoluteUri, "DEBUG");
}
目前我把它放在 Application_BeginRequest 方法下的 Global.asax 文件中。请告诉我是否有更合适的地方!
IsSecure 是一种从我的 web.config 文件中列出的部分中查找页面名称的方法,如果它们应该是安全的,则返回 true。
<SecurePages>
<add key="/XXXX/Login.aspx" value="page" />
<add key="/XXXX/Admin.aspx" value="page" />
<add key="/XXXX/Test.aspx" value="page" />
<add key="/XXXX/Scripts/ImportantScript.js" value="page" />
这适用于一般浏览网站,但是如果我现在尝试执行 Response.Redirect("~/TestPage.aspx");
这将在我们的生产环境中中断,导致页面被提供而没有 HTTP 或 HTTPS 信息:
www.mywebsite.com/XXXX/TestPage.aspx而不是http://www.mywebsite.com/XXXX/TestPage.aspx
我不明白为什么会这样。
作为一种解决方法,我停止使用 Response.Redirect 并编写了一个自定义重定向器,但是感觉这不是必需的。
public static void RedirectWithSecurity(string newPage)
{
string oldAbsoluteUri = HttpContext.Current.Request.Url.AbsoluteUri;
string oldUriAddress = HttpContext.Current.Request.Url.Segments[HttpContext.Current.Request.Url.Segments.Length - 1];
string newUriStripped = oldAbsoluteUri.Remove(oldAbsoluteUri.LastIndexOf(oldUriAddress));
string path =newUriStripped+ newPage;
if (IsSecure(path) && path.Contains("http://")) path = path.Replace("http://", "https://");
else if (!IsSecure(path) && path.Contains("https://")) path = path.Replace("https://", "http://");
ErrorHandling.JustWriteToDatabase("CODE REDIRECT: FROM: " + oldAbsoluteUri + " TO: " + path, "DEBUG");
HttpContext.Current.Response.Redirect(path);
}
当前问题,相当肯定不是解决方法的结果
所以现在这对我的基本页面和我的重定向非常有效,但是我的 AjaxControlToolKit 组件已经停止对使用 HTTPS 的页面工作。通过使用提琴手查看网络流量,我注意到 WebResource.axd 文件正在通过 HTTP 为我的 HTTPS 页面发送......但是谁能告诉我为什么?
我在这里找到了一个潜在的解决方案:http: //solutionmania.com/blog/2009/8/1/automatically-switching-to-ssl-in-asp-net但这是另一种解决方法,我宁愿理解和处理与根本问题。
使用的平台:IIS 7、ASP.NET 4.5。哦,如果相关的话,我正在使用 MasterPages。(ToolkiScriptManager 在 Masterpage 中定义)