Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET Webforms中的部分SSL而不更改IIS配置_Asp.net_Ssl_Webforms - Fatal编程技术网

ASP.NET Webforms中的部分SSL而不更改IIS配置

ASP.NET Webforms中的部分SSL而不更改IIS配置,asp.net,ssl,webforms,Asp.net,Ssl,Webforms,我们有一个非常简单的ASP.NET web应用程序,它主要由静态内容和一个我们希望用SSL保护的表单组成。安全页面位于其自己的文件夹中,但它继承自不安全的母版页,并与网站的其余部分共享一些其他资源(徽标、css文件和一些图片)。该站点由第三方托管,更改IIS配置(或更改为其他主机)不是一个选项 据我们所知,在ASP.NET上处理部分SSL时存在一些挑战: 防止出现“此页面同时包含安全和非安全项目”消息 提供对相对URL的支持,因为它们在重定向到安全页面时默认情况下不起作用 由于潜在的性能问题,我

我们有一个非常简单的ASP.NET web应用程序,它主要由静态内容和一个我们希望用SSL保护的表单组成。安全页面位于其自己的文件夹中,但它继承自不安全的母版页,并与网站的其余部分共享一些其他资源(徽标、css文件和一些图片)。该站点由第三方托管,更改IIS配置(或更改为其他主机)不是一个选项

据我们所知,在ASP.NET上处理部分SSL时存在一些挑战:

  • 防止出现“此页面同时包含安全和非安全项目”消息
  • 提供对相对URL的支持,因为它们在重定向到安全页面时默认情况下不起作用

  • 由于潜在的性能问题,我们不想保护整个网站,那么,什么是只保护一个特定页面或文件夹的最佳方法,同时保证此页面加载的任何资源也将得到保护?

    我发现最简单的方法是向特定页面添加代码,检查当前请求是否使用HTTPS。如果不是,请使用HTTPS重定向到同一URL。然后,将使用SSL加载整个页面。然后,确保指向其他页面的链接或重定向使用绝对HTTP。换句话说,整个站点可以启用SSL,但不需要SSL,并且web站点的链接将控制它何时被使用

    确保站点上的所有相对链接指向非HTTPS URL(即使当前页面当前正在使用HTTPS)的一种方法是使用HTML基本标记:

    <head> 
      <base href="http://yourdomain/" /> 
    </head>
    

    SSL在站点级别工作,而不是在文件夹级别。一旦您安装了SSL证书,您的网站就可以使用https协议访问,如下所示:
    https://www.example.com
    。同时,您的网站仍可通过
    http://www.example.com
    -没有性能问题

    只要使用相对路径,图像和CSS文件将使用https协议加载。母版页永远不会被客户端单独请求,所以SLL在这里并不真正适用

    使用此代码可以获得链接的绝对URL:

    <a href='<%= "https://" + Request.Url.Host + Page.ResolveUrl("~/Secure.aspx") %>'>Click me</a>
    

    我最终使用下面描述的解决方案覆盖了我想要保护的页面上的OnInit方法:

    对于其余的页面,我从一个基本页面继承了以下关于OnInit方法的代码:

    protected override void OnInit(EventArgs e)
    {
        if (Request.IsSecureConnection)
        {
            UriBuilder builder = new UriBuilder(Request.Url)
            {
                Scheme = Uri.UriSchemeHttp,
                Port = 80
            };
            Response.Redirect(builder.Uri.ToString());
        }
        base.OnInit(e);
    }
    

    Thx雅各布。根文件夹上的母版页、图像和css文件怎么样?当客户端请求安全页面时,它们都将使用SSL加载?另外,是否有任何方法可以动态更改链接,使其不需要绝对URL?是的,母版页及其所有链接到资源的链接也将以HTTPS的形式提供,因此应避免出现“安全和不安全”消息。
    protected override void OnInit(EventArgs e)
    {
        if (Request.IsSecureConnection)
        {
            UriBuilder builder = new UriBuilder(Request.Url)
            {
                Scheme = Uri.UriSchemeHttp,
                Port = 80
            };
            Response.Redirect(builder.Uri.ToString());
        }
        base.OnInit(e);
    }