c# - System.Web.Exception 401 при публикации данных

Мой метод запроса

    /// <summary>
    /// The formal method to use HTTPWebRequests.
    /// I got the headers out of Fiddler. I highly recommend this tool to follow HTTPWebRequests.
    /// Some Headers are unnecessary but i will use them for a natural-looking HTTPWebRequests.
    /// </summary>
    /// <param name="inpUrl">URL of the HTTPWebRequest.</param>
    /// <param name="inpMethod">Method of the HTTPWebRequest.
    /// Example: "POST", "GET", "PUT",...</param>
    /// <param name="inpReferer">The Referer of the URL. Sometimes its needed.</param>
    /// <param name="inpHost">The Host of the request.</param>
    /// <param name="inpAccept">Accept format of the request.</param>
    /// <param name="inpNvc">Data which will be wrote if you will do a "Post".</param>
    /// <param name="inpXml">If Ajax, then this is required.</param>
    /// <param name="autoRedirect">Auto-Redirect.</param>
    /// <returns>A HttpWebResponse of the request.</returns>
    private HttpWebResponse Request(string inpUrl, string inpMethod, string inpReferer, string inpHost, string inpAccept, NameValueCollection inpNvc, bool inpXml, bool autoRedirect)
    {
        var request = (HttpWebRequest)WebRequest.Create(inpUrl);
        request.Accept = inpAccept;
        request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";
        request.Timeout = 20000;
        request.Headers.Add("Accept-Language", "de,en-US;q=0.7,en;q=0.3");
        request.AllowAutoRedirect = autoRedirect;
        request.CookieContainer = _cookies;
        request.Method = inpMethod;
        //Volatile variables

        if (inpHost != "")
        {
            request.Host = inpHost;
        }

        if (inpReferer != "")
        {
            request.Referer = inpReferer;
        }
        if (inpXml)
        {
            request.Headers.Add("X-Requested-With", "XMLHttpRequest");
            request.Headers.Add("X-Prototype-Version", "1.7");
            request.Headers.Add("Cache-Control", "no-cache");
            request.Headers.Add("Pragma", "no-cache");
        }

        if (inpMethod != "POST") return request.GetResponse() as HttpWebResponse;
        var dataString = (inpNvc == null ? null : string.Join("&", Array.ConvertAll(inpNvc.AllKeys, key =>
            HttpUtility.UrlEncode(key) +"=" + HttpUtility.UrlEncode(inpNvc[key])
            )));
        if (dataString == null) return request.GetResponse() as HttpWebResponse;
        var dataBytes = Encoding.UTF8.GetBytes(dataString);
        request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        request.ContentLength = dataBytes.Length;
        using (var requestStream = request.GetRequestStream())
        {
            requestStream.Write(dataBytes, 0, dataBytes.Length);
        }
        return request.GetResponse() as HttpWebResponse;
    }

Я использовал обычно, но сегодня. Он выдает мне ошибки, когда я пытался опубликовать новый заказ на веб-сайте магазина. Я вошел в систему на веб-сайте с помощью программы, после чего я добавляю файлы cookie в контейнер, но программа выдает System.Web.Exception 401 //Ошибка авторизации.

Я пытаюсь запросить https://backpack.tf/classifieds/sell/4219201808 HTML form = http://pastebin.com/5xLp2jSU Мой метод почтового заказа =

    public void PostOrder(string inpUrl, string metal, int key, string message, bool tradeOffer, bool buyOut, string tradeOfferUrl)
    {
        var data = new NameValueCollection
        {
            {"user-id", _userId},
            {"currencies[metal]", metal},
            {"currencies[keys]", key.ToString()},
            {"details", message}
        };
        if (tradeOffer)
        {
            if (tradeOfferUrl != string.Empty)
            {
                data.Add("offers", "1");
                data.Add("tradeoffers_url", tradeOfferUrl);
            }
        }
        else
        {
            data.Add("offers", "0");
            data.Add("tradeoffers_url", "");
        }
        data.Add("buyout", buyOut ? "1" : "0");
        const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        const string referer = "http://backpack.tf/classifieds/buy/Strange/Rust%20Botkiller%20Scattergun%20Mk.I/Tradable/Craftable";
        const string host = "backpack.tf";
        using (var httpResponse = Request(inpUrl, "POST", referer, host, accept, data, false, false))
        {
            _cookies.Add(httpResponse.Cookies);
        }
    }

Мой метод входа

public void DoLogin(string inpSteamUserName, string inpSteamPassword, string inpSharedSecret = "")
    {
        _cookiePath += inpSteamUserName + ".auth";
        var responseString = GetIndex();
        SetUserId(responseString);
        var location = PostLogin();
        SetOpenIdParams(location);
        // Now do Steam Login.
        dynamic steamResult = DoSteamLogin(inpSteamUserName, inpSteamPassword, inpSharedSecret);
        if (steamResult == null) return;
        PostTransfer(steamResult.transfer_parameters.steamid.ToString(),
            steamResult.transfer_parameters.token.ToString(),
            steamResult.transfer_parameters.auth.ToString(),
            steamResult.transfer_parameters.remember_login.ToString(),
            steamResult.transfer_parameters.token_secure.ToString());
        location = OpenIdLogin();
        location = GetBackpackCookies(location);
        if (location == "/" || location == "https://backpack.tf/")
        {
            // Verify Cookies.
            const string url = "https://backpack.tf/";
            const string method = "GET";
            const string host = "backpack.tf";
            const string accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            FetchRequest(url, method, "", host, accept, null, false, true);
        }
        Log.Success("Bot logged in to backpack.tf");

а также

 private dynamic DoSteamLogin(string username, string password, string inpSharedSecret)
    {
        dynamic returnObject;
        var data = new NameValueCollection { { "username", username } };
        const string accept = "text/javascript, text/html, application/xml, text/xml, */*";
        const string referer = "https://steamcommunity.com/openid/login?openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.mode=checkid_setup&openid.return_to=http%3A%2F%2Fbackpack.tf%2Flogin&openid.realm=http%3A%2F%2Fbackpack.tf&openid.ns.sreg=http%3A%2F%2Fopenid.net%2Fextensions%2Fsreg%2F1.1&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select";
        const string host = "steamcommunity.com";
        var response = FetchRequest("https://steamcommunity.com/login/getrsakey", "POST", referer, host, accept,
            data, true, false);
        var rsaJson = JsonConvert.DeserializeObject<GetRsaKeyBackPack>(response);

        // Validate
        if (!rsaJson.Success)
        {
            return null;
        }

        //RSA Encryption
        var rsa = new RSACryptoServiceProvider();
        var rsaParameters = new RSAParameters
        {
            Exponent = HexToByte(rsaJson.PublickeyExp),
            Modulus = HexToByte(rsaJson.PublickeyMod)
        };

        rsa.ImportParameters(rsaParameters);

        var bytePassword = Encoding.ASCII.GetBytes(password);
        var encodedPassword = rsa.Encrypt(bytePassword, false);
        var encryptedBase64Password = Convert.ToBase64String(encodedPassword);

        SteamResultBackPack loginJson = null;
        CookieCollection cookieCollection;
        var steamGuardText = "";
        var steamGuardId = "";
        do
        {
            Log.Success("SteamWeb: Logging In...");

            var captcha = loginJson != null && loginJson.CaptchaNeeded;
            var steamGuard = loginJson != null && loginJson.EmailauthNeeded;

            var time = Uri.EscapeDataString(rsaJson.Timestamp);
            var capGid = "-1";
            if (loginJson != null)
            {
                capGid = Uri.EscapeDataString(loginJson.CaptchaGid);
            }
            data = new NameValueCollection { { "password", encryptedBase64Password }, { "username", username } };

            // Captcha
            var capText = "";
            if (captcha)
            {
                Console.WriteLine("SteamWeb: Captcha is needed.");
                System.Diagnostics.Process.Start("https://steamcommunity.com/public/captcha.php?gid=" + loginJson.CaptchaGid);
                Console.WriteLine("SteamWeb: Type the captcha:");
                capText = Uri.EscapeDataString(Console.ReadLine());
            }

            data.Add("captchagid", captcha ? capGid : "");
            data.Add("captcha_text", captcha ? capText : "");
            if (inpSharedSecret != "")
            {
                var twoFactorGenerator = new SteamTwoFactorGenerator
                {
                    SharedSecret = inpSharedSecret
                };
                data.Add("twofactorcode", twoFactorGenerator.GenerateSteamGuardCodeForTime());
            }
            else
            {
                data.Add("twofactorcode", "");
            }

            data.Add("remember_login", "false");

            // Captcha end

            // SteamGuard
            if (steamGuard)
            {
                Console.WriteLine("SteamWeb: SteamGuard is needed.");
                Console.WriteLine("SteamWeb: Type the code:");
                steamGuardText = Uri.EscapeDataString(Console.ReadLine());
                steamGuardId = loginJson.Emailsteamid;
                data.Add("loginfriendlyname", "machine1");
            }
            else
            {
                data.Add("loginfriendlyname", inpSharedSecret);
            }

            data.Add("emailauth", steamGuardText);
            data.Add("Emailsteamid", steamGuardId);
            data.Add("donotcache", "1440170894227");

            // SteamGuard end

            data.Add("rsatimestamp", time);

            using (var webResponse = Request("https://steamcommunity.com/login/dologin/", "POST", referer, host, accept, data, true, false))
            {
                // ReSharper disable once AssignNullToNotNullAttribute
                using (var reader = new StreamReader(webResponse.GetResponseStream()))
                {
                    var json = reader.ReadToEnd();
                    returnObject = JObject.Parse(json);
                    loginJson = JsonConvert.DeserializeObject<SteamResultBackPack>(json);
                    cookieCollection = webResponse.Cookies;
                }
            }
        } while (loginJson.CaptchaNeeded || loginJson.EmailauthNeeded);


        if (loginJson.Success)
        {
            foreach (Cookie cookie in cookieCollection)
            {
                _cookies.Add(cookie);
            }
            return returnObject;
        }
        Console.WriteLine("SteamWeb Error: " + loginJson.Message);
        return null;
    }

Мой метод запроса выдает ошибки только при публикации нового заказа.

Исправлено: источником является метод входа в систему.


person Murat sırma    schedule 28.08.2016    source источник
comment
у вас есть код или документация для запрошенного URL?   -  person Robert    schedule 28.08.2016
comment
Зайдите в историю веб-браузера и удалите все файлы cookie. Закройте все окна IE и повторите попытку. если это не сработает, откройте вручную IE и попробуйте запросить вручную. Тогда попробуйте с приложением.   -  person jdweng    schedule 28.08.2016
comment
@ Роберт, теперь я лучше объясню.   -  person Murat sırma    schedule 28.08.2016
comment
@jdweng Я пытался, но все равно.   -  person Murat sırma    schedule 28.08.2016
comment
@Muratsirma, где ваша логика авторизации?   -  person Robert    schedule 28.08.2016
comment
@Robert, я добавил свои методы входа в систему.   -  person Murat sırma    schedule 28.08.2016
comment
Можно ли вручную войти в базу данных? Администратор может заблокировать вход в систему.   -  person jdweng    schedule 28.08.2016
comment
Возможный дубликат Получить 401 неавторизованный веб-исключение при использовании rest json api в c#   -  person Paul Sweatte    schedule 24.05.2017