WebClient访问页面和凭证

我正在尝试访问受密码保护的同一域/同一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");

}

回答:

我怀疑您尝试访问的网页使用了表单身份验证。这意味着,如果您希望能够访问受保护的资源,则必须提供有效的身份验证cookie。为了获得有效的身份验证Cookie,您必须首先通过向发出Cookie的LogOn页面发送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不正确,您可能需要在登录请求中发送几个其他参数。您可以执行以下操作:在Web浏览器中进行身份验证,并使用FireBug查找需要发送的确切参数和标头。

以上是 WebClient访问页面和凭证 的全部内容, 来源链接: utcz.com/qa/415407.html

回到顶部