Login automático autenticación fba

Iniciado por el_doctor, 13 Octubre 2015, 06:50 AM

0 Miembros y 1 Visitante están viendo este tema.

el_doctor

¿Es posible autenticarse de forma automática en un sitio que usa autenticación basada en formularios? Poder enviar mediante un post un usuario y contraseña un membership ya configurado en la base de datos y que estén estáticos en el web.config del sitio externo para ingresar.

el_doctor

Hola haciendo un poco de investigación encontré una posible solución haciendo un post con httpWebRequest; actualmente puedo hacer un post al sitio externo desde mi sitio enviando el post con los mismos valores que el sito externo los envía esto verificándolo con tamper de firefox; y me retorna el contenido html de la página html que muestra después de logearse; pero lo que quiero es validar la autenticación en el navegador por lo que necesito la cookie que entrega el host cuando uno se logea desde el navegador; pero no logro obtenerla; si alguien puede ayudarme se los agradezco. Dejo el código que tengo hasta el momento:

Código (csharp) [Seleccionar]
string url = ConfigurationManager.AppSettings.Get("url");

            CookieContainer myCookie = new CookieContainer();

            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

            request.CookieContainer = myCookie;
            request.Method = "GET";
            request.KeepAlive = false;

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;

            Stream responseStream = response.GetResponseStream();

            StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);

            string src = reader.ReadToEnd();

            //Get ViewState
            string VSFlag = "id=\"__VIEWSTATE\" value=\"";

            int i = src.IndexOf(VSFlag) + VSFlag.Length;
            int j = src.IndexOf("\"", i);

            string viewState = src.Substring(i, j - i);

            //Get ViewStateGenerator
            string VSGenF = "id=\"__VIEWSTATEGENERATOR\" value=\"";

            i = src.IndexOf(VSGenF) + VSGenF.Length;
            j = src.IndexOf("\"", i);

            string viewStateGenerator = src.Substring(i, j - i);

            //Event Validation
            string eventValidationF = "id=\"__EVENTVALIDATION\" value=\"";
            i = src.IndexOf(eventValidationF) + eventValidationF.Length;
            j = src.IndexOf("\"", i);

            string eventValidation = src.Substring(i, j - i);

            string submit = "Sign In";
            string user = ConfigurationManager.AppSettings.Get("user");
            string password = ConfigurationManager.AppSettings.Get("pass");

            viewState = HttpUtility.UrlEncode(viewState);
            eventValidation = HttpUtility.UrlEncode(eventValidation);
            viewStateGenerator = HttpUtility.UrlEncode(viewStateGenerator);
            submit = HttpUtility.UrlEncode(submit);
            user = HttpUtility.UrlEncode(user);
            password = HttpUtility.UrlEncode(password);

            string strPost = "POSTDATA=__LASTFOCUS=&__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE={0}"
                + "&__VIEWSTATEGENERATOR={1}&__EVENTVALIDATION={2}&ctl00%24PlaceHolderMain%24signInControl%24UserName={3}"
                + "&ctl00%24PlaceHolderMain%24signInControl%24password={4}&ctl00%24PlaceHolderMain%24signInControl%24login={5}";

            string postStr = string.Format(strPost, viewState, viewStateGenerator, eventValidation, user, password, submit);

            byte[] postData = Encoding.ASCII.GetBytes(postStr);

            request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.Referer = url;
            request.KeepAlive = true;
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0";
            request.ContentType = "application/x-www-form-urlencoded";
            request.CookieContainer = myCookie;

           

            Cookie ck = new Cookie("SworkCookie", string.Empty);

            ck.Domain = request.RequestUri.Host;

            request.CookieContainer.Add(ck);
            request.CookieContainer.Add(response.Cookies);

            request.CookieContainer = myCookie;
            request.ContentLength = postData.Length;

            //------------


            //submit
            Stream outputStream = request.GetRequestStream();
            outputStream.Write(postData, 0, postData.Length);
            outputStream.Close();

            //accept
            response = request.GetResponse() as HttpWebResponse;           

           
            responseStream = response.GetResponseStream();
            reader = new StreamReader(responseStream, Encoding.UTF8);

            string srcString = reader.ReadToEnd();

OscarCadenas_91

Hola, si dices que encontraste la posible solucion entonces solo tienes que encontrar  el lugar donde entrega las cookies
la propiedad httpresponse.cookies: https://msdn.microsoft.com/es-es/library/system.net.httpwebresponse.cookies%28v=vs.110%29.aspx
 proporciona una instancia de la CookieCollection clase que contiene las cookies asociadas a esta respuesta.

Supongo que si despues de hacer la peticion para iniciar sesion en el response te mandara las cookies de inicio de sesion.
Solo tendrias que crear una funcion para Iniciar Sesion  y que el tipo de retorno sea CookieCollection
No se si estoy en lo correcto, pero es lo unico que se me ocurre.

con relacion a codigo no te puedo ayudar ya que aun no se mucho.