是否可以在服务器端执行 POST 到外部 HTTPS url 并将用户重定向到 POST 目标?

Posted

技术标签:

【中文标题】是否可以在服务器端执行 POST 到外部 HTTPS url 并将用户重定向到 POST 目标?【英文标题】:Is it possible to perform POST to external HTTPS url on server side and redirect user to the POST destination? 【发布时间】:2016-01-21 06:21:45 【问题描述】:

所以我可以做到以下POST提交

@html.BeginForm(null, null, FormMethod.Post, new  @action = "https://externalsite.com/secretroom" )
    
        <input id="SECRETCODE" name="SECRETCODE" type="hidden" value="GABEN" />
        <input type="submit" value="submit"/>
    

提交后,它会带我到https://externalsite.com/secretroom。但正如您所见,SECRETCODE 正在用户 HTML 页面中公开,我不希望这样。

所以我要做的是尝试在我的服务器端进行 POST。

public ActionResult Test()
    
            using (var client = new HttpClient())
            
                client.BaseAddress = new Uri("https://externalsite.com/secretroom");
                var content = new FormUrlEncodedContent(new[] 
                
                    new KeyValuePair<string, string>("SECRETCODE", "GABEN")
                );
                var result = await client.PostAsync("", content).Result;
                if(result.IsSuccessStatusCode)
                
                    return Redirect("https://externalsite.com/secretroom");
                
            
    

问题是我无法重定向用户,因为externalsite 会拒绝它,而且我不知道/无法控制secretroom 验证在externalsite 上的工作方式。如果我按照上面的方式进行操作,它只会允许访问。

话虽如此,这真的可能吗?

【问题讨论】:

【参考方案1】:

编辑:在更清楚地了解您要完成的工作之后,我不相信您可以做到这一点。特别是因为在您的第一个示例中,您实际上是在向用户浏览器发送响应,该浏览器将他们重定向到目标站点并发送表单参数以进行乘车。然而,以编程方式发布数据是浏览器带外的。这两种方法不可互换。如果您不满意以这种方式发送敏感数据,您很可能需要与网站提供商合作确定替代方法。

原始解决方案

您可以使用 WebRequest 类以编程方式 POST 数据。

WebRequest request = WebRequest.Create("https://externalsite.com/secretroom");
request.Method = "POST";
... rest omitted - refer to link below for specifics ...

https://msdn.microsoft.com/en-us/library/debx8sh9%28v=vs.110%29.aspx

此外,您可能需要参考以下 SO 问题,了解有关 WebRequest 类变体(即 HttpWebRequest、FtpWebRequest 等)的详细信息。

C# HttpWebRequest vs WebRequest

【讨论】:

那么如何在 POST 成功后重定向用户?似乎这只能通过使用HttpClient 获得我已经能够获得的响应,但我实际上需要将我的用户重定向到该页面。 @warheat1990 - 您可以像现在在第一个示例中所做的那样简单地做,但将方法设为FormMethod.Get,然后省略敏感数据。如果您尝试在幕后发布数据并同时转移用户 - 您不能这样做。 你能发布一些代码示例吗?尤其是省略数据部分和重定向。 @warheat1990 - 请参阅我回答中的编辑。在确切地意识到你想要做什么之后,你将无法以你目前使用的方式完成它——或者至少你需要比我更聪明的人的输入,如果有办法的话。 @warheat1990 - 实际上经过更多思考,实际上可能有办法做到这一点。当您使用带有秘密值的标准表单 POST 到该站点时 - 这是否有效地通过该站点对您进行身份验证?如果是这样,那么您可以从 HttpWebRequest 的响应中获取 auth cookie,然后转身将该 cookie 提供给您的正常响应。这会将 auth cookie 传递回您的目标站点,而您无需公开提供敏感数据。参考这个***.com/questions/16380189/…

以上是关于是否可以在服务器端执行 POST 到外部 HTTPS url 并将用户重定向到 POST 目标?的主要内容,如果未能解决你的问题,请参考以下文章

PhoneGap Ionic 项目未在 iOS 设备上执行 $http.post

app端开发中,外部js是否需要下载到本地,到负载均衡

C#小白使用入门,数据库操作,web端文件下载,执行外部程序,操作ini文件

是否可以将外部数据添加到 CloudKit?

如何向外部 Rest Api 发出 Http Post 请求? [关闭]

详解HTTP请求:get方法和post方法的区别