自定义HTTP模块打破相对路径..为什么以及如何修复?

时间:2013-08-14 09:55:29

标签: asp.net iis-7 https ajaxcontroltoolkit

背景+原始问题(使用解决方法)

我有一个网站,我希望将某些页面作为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(&#34;〜/ TestPage.aspx&#34;);

这会破坏我们的生产环境,导致页面没有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工作。通过使用fiddler查看网络流量,我注意到WebResource.axd文件是通过HTTP为我的HTTPS页面发送的......但是有谁可以告诉我为什么?

我在这里找到了一个可能的解决方案:http://solutionmania.com/blog/2009/8/1/automatically-switching-to-ssl-in-asp-net,但这是另一种解决方法,我宁愿理解并处理潜在的问题。

使用的平台: IIS 7,ASP.NET 4.5。 OH和我使用MasterPages如果相关的话。 (ToolkiScriptManager在主页中定义)

0 个答案:

没有答案