credentials - 具有凭据的 WebClient 仍未下载文件

标签 credentials webclient

我正在尝试使用用户名/密码从网站下载文件。您需要为注册帐户付费才能下载文件 - 我们已经做到了。我正在尝试传递用户名/密码并按如下方式下载文件:

if (docUrl != null)
            {
                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
                    this.WebClientInstance.Credentials = new NetworkCredential(username, password);

                fileData = this.WebClientInstance.DownloadData(docUrl);
                this.WebClientInstance.Dispose();
                isDataDownloaded = true;
            }

WebClientInstance 是一个 System.Net.WebClient。我调试并验证了它是否正在设置凭据。我没有下载 PDF,而是得到了一个 HTML 页面,提示我登录以访问该文件。我已验证用户名/密码正确。我使用相同的凭据与 WatiN 一起抓取网站。

还有什么我应该在这里做的吗?

更新

好的,我四处搜寻了一下,找到了一些关于这个问题的有用信息。我还没有让它工作,但我想我更接近了。首先,您需要创建一个扩展 WebClient 类的 cookie 感知 WebClient,如下所示:

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        this.CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var webRequest = base.GetWebRequest(address);

        if (webRequest is HttpWebRequest)
            (webRequest as HttpWebRequest).CookieContainer = this.CookieContainer;

        return webRequest;
    }
}

接下来是使用WebClient.UploadValues()方法将登录信息上传到目标网站。目标资源鉴权和下载的完整流程如下:

using (var webClient = new CookiesAwareWebClient())
                    {
                        var postData = new NameValueCollection()
                        {
                            { "userId", username },
                            { "password", password }
                        };

                        webClient.UploadValues(docUrl, postData);

                        fileData = webClient.DownloadData(docUrl);
                    }

我对网站使用表单验证的看法是错误的。它是一个 JSP 网站并使用 JSESSIONID。我已经验证我正在取回一个 cookie,其中似乎是一个有效的 32 字节 JSESSIONID 值。

但是,当我调用 WebClient.DownloadData() 时,它仍然只返回重定向的登录页面。我试图通过将 HttpWebRequest 上的 AllowAutoRedirect 属性设置为 false 来解决此问题,但随后它返回 0 个字节。

还有什么我需要做的,这样它就不会重定向,并且会在我通过身份验证后将我带到该资源吗?

最佳答案

(在问题编辑中回答。转换为社区维基答案。参见 Question with no answers, but issue solved in the comments (or extended in chat))

OP 写道:

Solved. So the problem was between my ears. I was passing in the URL for the secure resource to the .UploadValues() method, knowing that it would redirect to the login page. However, I really needed to pass in the URL from the login form (where it goes upon submitting) - not the login page itself. Once I did that, it worked correctly. I think I'm going to go find a career in food service now.

LINKS

There were already a few questions posted on SO that addressed this issue. I just didn't know what I was looking for at first so I didn't see those... Anywhere here are a couple good resources that I came across when working on this issue:

how to maintaine cookies in between two Url's in asp.net

Trying to get authentication cookie(s) using HttpWebRequest

关于credentials - 具有凭据的 WebClient 仍未下载文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457487/

相关文章:

api - 我应该共享 Paypal API 凭据吗

curl - 使用带有用户名和密码的 cURL?

powershell - 如何在powershell脚本中添加凭据,以便当我运行脚本时它不会要求输入密码,我不希望在脚本中看到密码

c# - 如何捕捉远程服务器返回错误: NotFound?

PowerShell 和 Net.WebClient。需要澄清工作行为

c# - 当服务器返回错误时,有什么方法可以使用 WebClient 访问响应主体?

Android - 我们应该将用户名和密码保存在设备内存中的什么位置?

elasticsearch - Kibana要求提供凭据

forms - 在不使用 'Invoke-WebRequest' 的情况下发布 HTTP 表单

Android WebView 无法在 UIDAI/Aadhaar 网站上的 DownloadStart 上下载文件