在C#中进行身份验证后使用cPanel安全令牌

时间:2013-11-03 19:53:07

标签: c# php cpanel

我到处寻找,我似乎无法弄清楚这一点:

在C#中验证cPanel会话后,我从网址中抓取安全令牌并尝试将其插入API调用,我收到各种错误(通常是访问被拒绝或无效令牌)。

有一点需要注意的是,我正在尝试使用cPanel中的安全端口,在本例中是端口2083.但是,当使用hostgator托管时,我将从我的域重定向到安全hostgator子域以进行记录在(gatorXXXX.hostgator.com:2083/),我想知道这是否会引发一些事情。

首先,我尝试使用以下代码,我在另一个stackoverflow帖子中找到了该代码,但我将其修改为:

检查cPanel登录是否将我从我的域重定向到子域以进行登录,如果是这样,请抓取该子域,然后将其插入,再次运行代码,并获取会话令牌。

public static string Connect(string url, string userName, string password, string userAgent, string postData, int timeOut)
    {
        string result = "";

        // set a flag to determine if the cpanel page is different than the url
        bool moved = false;
        string newUrl = "";

        try
        {
            // Create a request for the URL.        
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

            if (userAgent == null)
                userAgent = UserAgent;

            request.UserAgent = userAgent;
            request.Timeout = timeOut;

            if (userName.Length > 0)
            {
                string authInfo = userName + ":" + password;
                authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
                request.Headers["Authorization"] = "Basic " + authInfo;
                request.AllowAutoRedirect = false;
            }

            if (postData.Length > 0)
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.CookieContainer = new CookieContainer();
                // Create POST data and convert it to a byte array.
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
                request.ContentLength = byteArray.Length;
                using (Stream dataStream = request.GetRequestStream())
                {
                    dataStream.Write(byteArray, 0, byteArray.Length);
                }
            }

            // Get the response.
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                // Get the stream containing content returned by the server.
                Stream dataStream = response.GetResponseStream();
                response.Cookies = new CookieCollection();
                // Open the stream using a StreamReader for easy access.
                using (StreamReader reader = new StreamReader(dataStream))
                {
                    result = string.Format("Server response:\n{0}\n{1}", response.StatusDescription, reader.ReadToEnd());
                }


                if (response.StatusDescription.ToLower().Contains("moved") && !response.Headers.ToString().Contains("/cpsess"))
                {
                    newUrl = StringUtils.ExtractNoCase(result.ToLower(), "url=", "\">", 1);
                    moved = true;
                }
                else return result;
            }
        }

        catch (Exception e)
        {
            result = string.Format("There was an error:\n{0}", e.Message);
        }

        // if the cpanel login is at a different location, Connect() with new url
        if (moved == true)
        {
            result = Connect(newUrl, userName, password, null, postData, 8000);
        }
        return result;
    }

现在,在获取安全令牌后,我尝试将其插入原始网址(https://mydomain.com:2083/cpsess12334455/xml-api/..。)和hostgator子域(https://gatorXXXX.hostgator.com:2083/cpsess/...。),并且两种方式都被拒绝了。

所以经过几天的斗争后,我决定尝试使用phalanger来执行此任务,因为我发现的cPanel身份验证的大部分示例都是php / curl。

所以我使用以下代码:

function Authentication($hostname, $username, $password)
{
    $download_url = "https://".$hostname.":2083/login/";
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_HEADER,0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_URL, $download_url);
    curl_setopt($curl, CURLOPT_POSTFIELDS, "user=".$username."&pass=".$password);
    $result = curl_exec($curl);
    curl_close($curl);
    $parts = explode( 'URL=', $result);
    $session_parts = explode( '/frontend/', $parts[1]);
    $token = $session_parts[0];

    $subdomain = "https://".$hostname.":2083" . $token . "/json-api/cpanel";

 }

然后尝试发布类似以下的内容(应该将新的子域附加到域中):

$curl = curl_init();
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_HEADER,0);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,1);
    curl_setopt($curl, CURLOPT_URL, $subdomain);
    curl_setopt($curl, CURLOPT_POSTFIELDS, "user=username&cpanel_jsonapi_module=SubDomain&cpanel_jsonapi_func=addsubdomain&cpanel_jsonapi_version=2&domain=testingthis2&rootdomain=myrootdomain.com");

    $result = curl_exec($curl);
    curl_close($curl);

当我获得安全令牌时,即使从我的浏览器复制安全令牌并运行API调用,我总会得到以下结果:

{“cpanelresult”:{“apiversion”:“2”,“error”:“Token denied”,“data”:{“reason”:“Token denied”,“result”:“0”},“键入 “:” 文本“}}

所以我很难过。我更喜欢在c#中完成所有这一切,而不是使用phalanger,因为我不像在C#中那样精通PHP,但是在这一点上我会采用任何一种方法,如果有人可以工作。

我想要做的就是获取安全令牌并将其插入我选择的API调用中,并让cPanel接受我的安全令牌并处理API调用。

1 个答案:

答案 0 :(得分:0)

这可能更多的是建议而非答案,因为我不知道C#和您的确切案例。

根据我的经验,我发现使用会话令牌是不够的,你还必须在登录时使用它(我认为,存储在cookie中)。因此,例如,如果您在一个浏览器中登录但尝试使用会话令牌在另一种浏览器上进行api调用,则它将无法工作。只有在您登录的同一个浏览器中尝试api调用时才会起作用。

因此,在C#中,您必须使用某种类型的crawler / http客户端进行登录,并使用相同的方式进行api调用。

希望有所帮助。