与凭证Web客户端访问页面与凭证Web客户端访问页面(WebClient accessing pag

2019-06-02 14:37发布

我试图访问在同一个域/同样的asp.net应用程序的网页,这是密码保护。 凭据都进行网页射击这个呼叫,网页被访问一样。

下面是代码,我不知道为什么我总是一个登录表单的HTML代码结束了?

using (WebClient client = new WebClient())
{
    client.QueryString.Add("ID", "1040"); //add parameters
    //client.Credentials = CredentialCache.DefaultCredentials;
    //I tried to add credentials like this
    client.Credentials = new NetworkCredential("username", "password");

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx");
}

Answer 1:

我怀疑你是试图访问使用Web页面表单验证。 这意味着你必须提供有效的身份验证cookie,如果你希望能够访问受保护的资源。 而为了获得有效的身份验证cookie,你将不得不通过发送POST请求发出的cookie中的登录页面先验证自己的身份。 当你获得这个cookie的,你将能够一起发送关于保护资源的后续请求。 你也应该注意到,开箱即用的WebClient不支持cookie。 出于这个原因,你可以写一个自定义的cookie识别Web客户端:

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

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = (HttpWebRequest)base.GetWebRequest(address);
        request.CookieContainer = CookieContainer;
        return request;
    }
}

现在你可以使用这个客户端仍然发射了2个请求:

using (var client = new CookieAwareWebClient())
{
    var values = new NameValueCollection
    {
        { "username", "john" },
        { "password", "secret" },
    };
    client.UploadValues("http://domain.loc/logon.aspx", values);

    // If the previous call succeeded we now have a valid authentication cookie
    // so we could download the protected page
    string result = client.DownloadString("http://domain.loc/testpage.aspx");
}

显然,由于ASP.NET的ViewState的crapiness您可能需要发送其他几个参数沿着你的登录请求。 这里是你可以做:在Web浏览器进行身份验证,并与萤火虫看起来需要发送的确切参数和头部。



文章来源: WebClient accessing page with credentials