如何使用WebClient登录网站?

31

我希望使用C#中的WebClient对象下载某些内容,但是下载域要求我登录。如何使用WebClient登录并保留会话数据?我知道如何使用WebClient提交数据。


1
服务器需要什么样的身份验证机制?基本的,表单的,Windows/NTLM的? - Peter Lillevold
2
我通过查看Firefox的Cookie并手动添加值来解决了这个问题 :) webClient.Headers.Add("Cookie", "PHPSESSID=xxxxxxx; mosesuser=xxxxxxx; "); - Furkan Gözükara
哪些值?你是指实际的身份验证 cookie 吗?请记住,该值可能会过期,并且不能在以后重复使用。 - Peter Lillevold
是的,我知道。所以每当我运行软件时,我会通过Firefox登录并复制粘贴Cookie :) - Furkan Gözükara
2个回答

50

如果你遇到的问题是能够进行身份验证,但无法保持身份验证 cookie,那么这里有一个具备 cookie 意识的 WebClient 版本。

private class CookieAwareWebClient : WebClient
{
    public CookieAwareWebClient()
        : this(new CookieContainer())
    { }
    public CookieAwareWebClient(CookieContainer c)
    {
        this.CookieContainer = c;
    }
    public CookieContainer CookieContainer { get; set; }

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

        var castRequest = request as HttpWebRequest;
        if (castRequest != null)
        {
            castRequest.CookieContainer = this.CookieContainer;
        }

        return request;
    }
}

编辑: 你给我提供的链接使用了HTTP POST的表单验证,我没有时间去详细了解它,但至少它可以为你在Google上的搜索提供一个起点。


1
我找到了这个。但是我需要做什么?我需要通过HttpWebRequest进行身份验证吗? - Furkan Gözükara
这取决于你连接的网站使用哪种身份验证系统。请参考其他响应中关于身份验证的提示。 - Scott Chamberlain
1
我希望这篇文章能够包含一个实际认证流程的示例。 - Shimmy Weitzhandler
1
@MonsterMMORPG 在 https://dev59.com/jWgu5IYBdhLWcg3wuJWF 中有类似的解决方案,并提供了示例使用代码。 - hardywang
如果您在代码示例中注明了要包含哪些命名空间,那将为我节省很多时间。这是非常重要的信息需要知道... - Anthony
@Anthony 如果你在谷歌中输入 MSDN WebClient,第一个结果就是WebClient的MSDN页面,其中包括命名空间。对于任何.NET类,只需输入 MSDN YourClassName,你要查找的类将在前3个链接中。 - Scott Chamberlain

-1

请查看使用凭据属性。例如,如果使用基本身份验证,则必须将该属性设置为具有正确用户名和密码的NetworkCredential实例。

示例指向了如何使用当前登录用户的凭据进行请求。


好的,我明白了。服务器使用表单身份验证。这需要您将用户名和密码发布到登录页面HTML中指定的操作URL。您还必须使用Cookie容器才能接收随该帖子响应一起发送的身份验证cookie。 - Peter Lillevold
@MonsterMMORPG DoesNotWorkNullReferenceException @MonsterMMORPG 无法工作的空引用异常 - C4d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接