c# - Página de acceso a WebClient con credenciales
asp.net credentials (1)
Estoy intentando acceder a una página web en el mismo dominio / misma aplicación asp.net, que está protegida con contraseña. Las credenciales son las mismas tanto para la página web que activa esta llamada como para la página web a la que se accede.
Aquí está el código, y no sé por qué siempre termino con un código html de formulario de inicio de sesión.
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");
}
Sospecho que la página web a la que intenta acceder utiliza la Autenticación de formularios. Esto significa que deberá proporcionar una cookie de autenticación válida si desea poder acceder a los recursos protegidos. Y para obtener una cookie de autenticación válida, primero deberá autenticarse enviando una solicitud POST a la página LogOn que emite la cookie. Una vez que recupere la cookie, podrá enviarla en solicitudes posteriores sobre recursos protegidos. También debe tener en cuenta que, de WebClient
, WebClient
no admite cookies. Por este motivo, puede escribir un cliente web personalizado con cookies:
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;
}
}
Ahora podría usar este cliente para disparar las 2 solicitudes:
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");
}
Obviamente, debido a la carencia de ViewState de ASP.NET, es posible que deba enviar un par de otros parámetros a lo largo de su solicitud de inicio de sesión. Esto es lo que puede hacer: autenticarse en un navegador web y mirar con FireBug los parámetros exactos y los encabezados que deben enviarse.