【问题标题】:How to redirect from HTTP to HTTPS in the ASP.NET page lifecycle?如何在 ASP.NET 页面生命周期中从 HTTP 重定向到 HTTPS?
【发布时间】:2011-10-14 11:27:31
【问题描述】:

我有一个 ASP.NET 页面,其中添加了很多服务器控件。当用户从 HTTP 访问页面时,我需要将请求重定向为使用 HTTPS。控件在Init 方法中动态加载,我正在Load 方法中进行重定向。但这最终会创建一个循环来加载控件,然后不断重定向。

我可以使用页面生命周期中的哪个事件来处理避免循环的重定向?

【问题讨论】:

    标签: asp.net http iis-7 ssl https


    【解决方案1】:

    您应该使用 Gloabal.asax 文件来执行此操作..试试这个 代码..

    protected void Application_BeginRequest(Object sender, EventArgs e)
    {
            if ( !Request.IsSecureConnection)
            {
                    string path = string.Format("https{0}", Request.Url.AbsoluteUri.Substring(4));
    
                    Response.Redirect(path);
            }
    }
    

    【讨论】:

    • 我明白了你们都想说。主要问题是我的动态控制加载。因为它所有的事件都在一次又一次地触发控制加载。这就是不断重定向的原因,它不能是眉毛。
    • 是的,你应该防止这种情况,然后你就可以实现重定向
    • 此外,如果您发现问题的答案很有用,您应该接受它们的答案(请参阅那里有一个勾号)并使用upvotes。它将帮助您获得更多问题的答案
    • 谢谢我必须防止这种情况发生。但它一次又一次地重复,所以我无法处理这个因为页面没有回发 .conrols 事件 r 触发了该页面上每个控件的页面加载事件..所以我在这里很困惑
    【解决方案2】:

    page lifecycle 中最早可以挂钩和重定向的点是 Page_PreInit 事件,因此我建议在此处执行您的方案检查和重定向。

    【讨论】:

    • 实际上,您可以在生命周期中的任何地方执行此操作,我通常在 OnInit 中执行。
    • 我明白了,你们都想说。主要问题是我的动态控制加载。因为它所有的事件都会一次又一次地在控制加载时触发。这就是不断重定向的原因,它不能是眉毛。
    【解决方案3】:

    如果可用,您应该使用 IIS 重写来执行此操作。规则是:

    <rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
        <match url="(.*)" />
        <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
            <add input="{HTTPS}" pattern="^OFF$" />
        </conditions>
        <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" />
    </rule>
    

    【讨论】:

      【解决方案4】:

      如果您不想加载控件,您应该在页面初始化的开头重定向。我使用这样的东西来重定向(我只是发出我想要的代码):

      protected void RedirectPage(string redirectUrl)
      {
          // Redirect the page, nothing should be shown in this case
          if (redirectUrl.StartsWith("~"))
              redirectUrl = ResolveClientUrl(redirectUrl);
          Response.Write("<head id=\"pageheader\">");
          Response.Write("</head>");
          Response.Write("<body onload=\"window.location = '" + redirectUrl + "';\">");
          Response.Write("</body>");
          Response.End();
      }
      

      【讨论】:

      • 非常感谢您的回复。我正在使用动态路由和动态加载控件,并且在加载全局 asax begin_request 中的每个控件时重复执行,不仅所有页面加载事件都会在控件加载时触发。所以对我来说变得非常困难
      • 在页面初始化的开头不会写出任何内容,所以我通常只是在第一行添加对上述函数的调用。控件将被初始化,但这应该不是问题。这可能是一种蛮力方法,但它非常适合安全检查。
      • 我发现,当我重定向它时,它重定向并再次开始加载控件,在此期间它再次重定向并再次开始加载控件。这就是为什么它从未完成我尝试过全局 asax,页面初始化加载preinit 不工作 ..:C
      • 我假设当你发现一个通过 http 连接的用户时,你总是想重定向到 https。在这种情况下,您应该检查用户是否在 http 上,然后才重定向到 https。您何时将用户重定向到 https?
      • 还有一点,你应该把它放在页面初始化而不是控件初始化中。
      猜你喜欢
      • 1970-01-01
      • 2016-12-12
      • 2011-09-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 2018-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多