Pregunta

Quiero navegar a una página en una aplicación web desde una aplicación de escritorio. "No hay problema", le oigo decir, "solo use el navegador por defecto con la dirección URL correcta". Sin embargo, la aplicación web ASP.NET utiliza la autenticación de formularios, y los usuarios no quieren ver la página de inicio de sesión debido a que ya se han autenticado con las mismas credenciales en la aplicación de escritorio.

Eso suena bastante simple, todo lo que tengo que hacer es emitir una HTTP POST desde la aplicación de escritorio con que falsifica la devolución de datos de la página de inicio de sesión de la aplicación web. La aplicación web podrá establecer su vale de autenticación y galletas de estado de sesión, devolverlos a mí, y los almacena en el almacén de cookies de IE. Puedo A continuación, vaya a la página deseada y la aplicación web a pensar que ya está autenticado.

Tengo algo de código de trabajo que construye el HTTP POST, lo envía y recibe una respuesta válida que contiene las galletas correctas. Sin embargo, no puedo ver la forma de escribirlos en el almacén de cookies de IE. Me puede punto cualquiera en la dirección correcta?

Código de ejemplo:

var requestUrl = Properties.Settings.Default.WebsiteLoginPageUrl;

var requestEncoding = Encoding.GetEncoding(1252);

// Simulated login postdata
var requestText = string.Format(
    "__VIEWSTATE={2}&__EVENTTARGET={3}&__EVENTARGUMENT={4}&__EVENTVALIDATION={5}&userNameText={0}&passwordText={1}&submitButton=Log+In",
    HttpUtility.UrlEncode(Properties.Settings.Default.UserName),
    HttpUtility.UrlEncode(Properties.Settings.Default.Password),
    Properties.Settings.Default.FakeViewState,
    Properties.Settings.Default.FakeEventTarget,
    Properties.Settings.Default.FakeEventArgument,
    Properties.Settings.Default.FakeEventValidation);

var request = (HttpWebRequest) WebRequest.Create(requestUrl);
request.Method = "POST";
request.Accept = "*/*";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = requestEncoding.GetByteCount(requestText);
request.Headers.Add(HttpRequestHeader.CacheControl, "no-cache");
request.AllowAutoRedirect = false;
request.KeepAlive = false;
request.CookieContainer = new CookieContainer();

using(var writer = new StreamWriter(request.GetRequestStream(), requestEncoding)) {
    writer.Write(requestText);
}

var response = (HttpWebResponse) request.GetResponse();

// TODO: Grab the response cookies and save them to the interactive desktop user's cookie store.

Process.Start(new ProcessStartInfo {
    FileName = Properties.Settings.Default.WebsiteTargetPageUrl,
    UseShellExecute = true,
});
¿Fue útil?

Solución

Es necesario llamar a la no administrado InternetSetCookie ( ) función . ¡Y mira! Alguien escribió el para interoperabilidad ya. Se debe comprobar su corrección sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top