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

时间:2015-10-22 03:51:46

标签: c# asp.net-mvc asp.net-mvc-5

所以我可以执行以下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 个答案:

答案 0 :(得分:1)

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

原始解决方案

您可以使用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