【问题标题】:ASP.Net (C#) How to POST to HTTPS from an HTTP pageASP.Net (C#) 如何从 HTTP 页面 POST 到 HTTPS
【发布时间】:2010-10-11 19:24:47
【问题描述】:

C# 3.0 ASP.Net 2.0 IIS6

我有一个常规的 [非 https] 页面。页面上有一个标准的 ASP.Net 格式。

页面上有两个功能“区域”。登录并“获取报价”。登录页面需要 POST 到 HTTPS,而页面的其余部分 [包括“其他区域”] 表单不能是 HTTPS。在 Java [JSP] 和常规 Html 中,我们只有两种形式。一个发布到 HTTPS,一个不发布。

在 ASP.Net [从一页] 中处理此问题的方法是什么。我知道我可以链接到 HTTPS login.aspx 页面,但业务部门确实希望将上下文放在一起。

有什么想法吗?

谢谢,

【问题讨论】:

    标签: c# asp.net https


    【解决方案1】:

    解决方法是使用asp.net指定一个“跨页回发”,即你使用任意按钮控件(LinkBut​​ton、Button、ImageButton等)的PostBackUrl属性。此属性允许您回发到您喜欢的任何页面。只需将您的 PostBackUrl 设置为页面的 https 版本,您就可以开始了(还要确保没有活动的 url 重定向会在您的页面上强制使用 http)。

    // ensure we send credentials over a secure connection
    if (!HttpContext.Current.Request.IsSecureConnection)
    {
         string postbackUrl = HttpContext.Current.Request.Url.AbsoluteUri.Replace("http", "https");
         LinkButton_Login.PostBackUrl = postbackUrl;
    }
    

    在您的特定情况下,您应该将一个按钮设置为回发到 https 版本,将另一个按钮设置为 http 版本(如果您没有指定 PostBackUrl,则默认设置是按原样回发到页面本身)。

    【讨论】:

    • 鉴于此页面上的答案,难怪网络如此不安全。我应该在咖啡店里闲逛,更频繁地闻包!顺便说一句,答案很好,几乎是唯一真正维护安全的答案(如果不是有点hacky!)
    【解决方案2】:

    您可以在一个 aspx 页面上有两个表单。你只是不能嵌套它们。

    在我建立的一个页面上,我有一个回发到页面的表单,一个回发到 Google Checkout 的表单。

    如果你必须混合页面的内容,把https表单放在页面底部(在主表单标签之后)并用隐藏字段填充它。当用户单击按钮时,使用 Javascript 为隐藏字段分配值,然后发布 https 表单。

    【讨论】:

      【解决方案3】:

      您可以使用登录事件的 HttpWebRequest 对象通过代码手动发布,然后将返回的响应写回用户的流。

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webRequest.URL);
      request.UserAgent = UserAgent;
      request.ContentType = ContentType;
      request.Method = "POST";
      
      // Write your bytes of the login section here
       Stream oStream = request.GetRequestStream();
       oStream.Write(webRequest.BytesToWrite, 0, webRequest.BytesToWrite.Length);
       oStream.Close();
      
       // Send the request and get a response
       HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
      
       // Read the response
       StreamReader sr = new StreamReader(resp.GetResponseStream());
      
       // return the response to the screen
       string returnedValue = sr.ReadToEnd();
      
        sr.Close();
        resp.Close();
      
        Response.Write(returnedValue);
      

      【讨论】:

        【解决方案4】:

        我从您的上下文中假设您正在做一件事或另一件事,而不是同时做两件事。

        查看按钮对象的 PostbackURL。
        登录按钮可以回发到“https://secure.login.com

        另一个按钮只能回发到页面本身。

        这里的问题是您仍然会将登录字段发回不安全的页面,这意味着它们没有加密,并且可能被嗅探。

        如果按下“获取报价”按钮,快速而肮脏的解决方法是让 javascript 在发布之前清除登录字段。

        【讨论】:

          【解决方案5】:

          HTTP 和 HTTPS 页面是否位于同一服务器/同一应用程序的一部分?

          如果是这样,您也许可以使用 Server.Transfer() 方法来保持表单完整,但也有 HTTPS。

          【讨论】:

            【解决方案6】:

            在 ASP.Net 3.5(可能是 SP1——忘记它是在基础库还是 SP)中,您现在可以设置“action”属性。但这会使其在两种“表单”中都发布到 HTTPS。

            如果您希望将两个表单放在同一页面上,并确定在“运行时”发布到哪个表单,则必须使用客户端代码来完成。在所有触发回发或挂钩到 _dopostback (或任何它被称为 - 懒得查找)函数的对象上都有客户端处理程序,并让它检查按下了哪个按钮。如果是非安全页面,则首先清除登录字段中的所有数据。然后自己手动触发回发到正确的页面。

            【讨论】:

              【解决方案7】:

              你不能只做一个 Response.Redirect("https://.../Login.aspx");在登录按钮单击事件中。

              【讨论】:

              • Jonathan:如果登录按钮事件中有一个 Response.Redirect,那不是已经在回发了吗?例如。用户名和密码会以明文形式发送吗?
              猜你喜欢
              • 1970-01-01
              • 2011-07-15
              • 1970-01-01
              • 1970-01-01
              • 2016-12-12
              • 2013-04-21
              • 2018-03-19
              • 1970-01-01
              • 2010-11-24
              相关资源
              最近更新 更多