c# webclient返回403禁止

Posted

技术标签:

【中文标题】c# webclient返回403禁止【英文标题】:c# webclient returns 403 forbidden 【发布时间】:2013-11-28 13:04:00 【问题描述】:

我正在尝试模拟在 Steam 中接受交易报价的过程。我已经询问了 Steam 支持,并确认只要我不中断他们对其他玩家的服务,就允许此操作。

所以这里是详细信息: 接受交易报价的网址是https://steamcommunity.com/tradeoffer/OfferID/accept

这是他们这样做的 ajax 代码

return $J.ajax(

    url: 'https://steamcommunity.com/tradeoffer/' + nTradeOfferID + '/accept',
    data: rgParams,
    type: 'POST',
    crossDomain: true,
    xhrFields:  withCredentials: true 

这是我使用 IE10 跟踪的标头

Request             POST /tradeoffer/xxxxxxx/accept HTTP/1.1
Accept              */*
Content-Type        application/x-www-form-urlencoded; charset=UTF-8
Referer             http://steamcommunity.com/tradeoffer/xxxxxxx/
Accept-Language     en-CA
Origin              http://steamcommunity.com
Accept-Encoding     gzip, deflate
User-Agent          Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)
Host                steamcommunity.com
Content-Length      51
DNT                 1
Connection          Keep-Alive
Cache-Control       no-cache

帖子正文:

sessionid=SESSIONID&tradeofferid=OfferID

饼干:

Sent    sessionid                SessionID          
Sent    __utmc                   XXXXX              
Sent    steamLogin               XXXXX
Sent    webTradeEligibility      XXXXXXX
Sent    Steam_Language           XXXXXXX                    
Sent    timezoneOffset           XXXXXXXX                   
Sent    __utma                   XXXXXXXXXXXXX              
Sent    __utmz                   XXXXXXXXXXXXX              
Sent    steamMachineAuth         XXXXXXXXXXXXX                  
Sent    strInventoryLastContext  XXXXXXXXX                  
Sent    steamRememberLogin       XXXXXXXXXXXX                   
Sent    steamCC_XXXXXXXXXXXX     XXXXXXX                    
Sent    __utmb                   XXXXXXX                
Sent    tsTradeOffersLastRead    XXXXXXX

请求的发起者是XMLHttpRequest

在我的代码中我做了

public bool AcceptOffer(string offerID)

    string path = "tradeoffer/" + offerID + "/";
    //Simulate the browser opening the trade offer window
    _steamWeb.Get(new Uri(WebAPI.SteamCommunity + path));
    NameValueCollection data = new NameValueCollection();
    data.Add("sessionid", _steamWeb.SessionID);
    data.Add("tradeofferid", offerID);

    string result = _steamWeb.Post(new Uri("https://steamcommunity.com/" + path + "accept"), data);

    return true;

_steamWeb 包含一个可识别 cookie 的网络客户端,用于执行所有 post/get 请求

这里是 cookie 感知网络客户端的部分代码

protected override WebRequest GetWebRequest(Uri address)

    HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;

    if (request != null)
    request.CookieContainer = _cookieContainer;

    if (_lastPage != null)
        request.Referer = _lastPage;

        _lastPage = address.ToString();
        return request;


protected override WebResponse GetWebResponse(WebRequest request)

    WebResponse response = base.GetWebResponse(request);//403 exception here
    ReadCookies(response);
    return response;

这是我设置的标题

void SetCommonHeaders(Uri uri)

    _webClient.Headers[HttpRequestHeader.Accept] = "text/html, application/xhtml+xml, */*";
    _webClient.Headers[HttpRequestHeader.AcceptLanguage] = "en-CA";
    _webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded; charset=UTF-8";
    _webClient.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)";
    _webClient.Headers[HttpRequestHeader.Host] = uri.Host;
    _webClient.Headers.Add("DNT", "1");

这是我发送的请求的 cookie 标头

sessionid=XXXX; 
steamMachineAuthXXXXX=XXXXXX; 
steamLogin=XXXXXXX; 
steamRememberLogin=XXXXXXXX; 
Steam_Language=english; 
webTradeEligibility=XXXXXXXXX; 
steamCC_XXXXX=CA; 
tsTradeOffersLastRead=XXXXXXXXX

我没有手动设置这些 cookie,所有这些 cookie 都通过对 steamcommunity.com 的 GET 请求来处理

我发送的请求几乎与浏览器相同,但我的帖子收到 403 Forbidden。我试图设置 X-Requested-With = XMLHttpRequest 标头,但它没有帮助。我看到他们在 ajax 调用中做一些凭证的事情,所以我想在我的 HttpWebRequest 帖子中也做一些事情吗?谢谢

【问题讨论】:

您可以尝试使用 Fiddler 跟踪两个不同的请求并比较结果吗? 我同意@scheien,使用 Fidler 跟踪您的请求。只是一些额外的信息,你可以下载 Fidler here steam 交易失败了,我想我得等到他们完成了 当您缺少 steamLoginSecure 标头时会发生这种情况 【参考方案1】:

问题解决了,有两点:

    由于 .NET 错误,未能正确发送 Keep alive 标头 我对 sessionid 进行了两次编码

【讨论】:

以上是关于c# webclient返回403禁止的主要内容,如果未能解决你的问题,请参考以下文章

c# Httpclient 请求在 Windows 10 上工作正常返回 403 在 Windows 7 上被禁止(相同的代码)

Google Docs:无法在 C# 中使用管理访问/模拟(禁止 403)导出/下载用户的文档

为啥我的代码返回 403 禁止访问

删除操作返回错误:出现意外错误(类型=禁止,状态=403)。禁止的

KeyCloak用户rest api返回403禁止,为啥?

nginx 上传文件时返回 403 禁止错误