HttpWebRequest login ekstern website


Forum --> ASP.NET

Author Comment
Kai Tangen Lunheim
HttpWebRequest login ekstern website 07.02.2011 11:22:52
Håper noen kan hjelpe, har kjørt meg skikkelig fast og føler jeg har lest alt Google har servert om temaet.
Saken er den at jeg skal utvide eksisterende pålogging på firmaets side til å håndtere pålogging til to sider. Brukerne blir flagget i databasen med ekstern/intern, hvis intern bruker fyres vanlig pålogginsmekanisme, hvis ekstern bruker skal pålogging skje på LOGIN_URL vist i koden under. Har forøkt meg med en løsning ved bruk av HttpWebRequest og har fått påloggingen til å fungere med koden under. Men det som er saken er at jeg ønsker å vise den autoriserte side i nettleseren etter at denne koden er eksekvert(Det jeg får tilbake i stringen buffer i slutten der er html fra den autoriserte siden). Hvis jeg redirecter til url'en funnet i location headeren så vises påloggingssiden selvom jeg har satt opp CookieContaineren til å "spare" på cookies på tvers av requests. Den har altså ikke noe kjenskap til at jeg har gjort en suksessfull pålogging. Dette er vel et session problem? Hva er det jeg ikke har fått med meg?


string LOGIN_URL = "https://infocenter.conecto.no/kundeweb/Default.aspx";

            //cookie container for our session
            CookieContainer cookies = new CookieContainer();

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(LOGIN_URL);
            webRequest.CookieContainer = cookies;

            //recieve non-authenticated cookie  
            webRequest.GetResponse().Close();

            //encode POST variables
            string postData = string.Format("dnn$ctr346$Login$uxtUserName={0}&dnn$ctr346$Login$uxtPassword={1}&__EVENTTARGET=dnn$ctr346$Login$uxbLogin", username, password);
            byte[] send = Encoding.UTF8.GetBytes(postData);

            //prepare our HttpWebRequest
            webRequest = (HttpWebRequest) WebRequest.Create(LOGIN_URL);
            webRequest.Method = "POST";
            webRequest.KeepAlive = false;
            webRequest.AllowAutoRedirect = false;
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.ContentLength = send.Length;
            webRequest.CookieContainer = cookies;

            // Write encoded post variable to the stream
            Stream stream = webRequest.GetRequestStream();
            stream.Write(send, 0, send.Length);
            stream.Flush();
            stream.Close();

            // Retrieve HttpWebResponse
            HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse();

            if (webResponse.StatusCode == HttpStatusCode.Found)
            {
                string redirecturl = webResponse.Headers["Location"];

                // Link the response cookie to the domain
                cookies.Add(webResponse.Cookies);

                // Prepare our navigate HttpWebRequest, and set its cookie.
                webRequest = (HttpWebRequest)WebRequest.Create(redirecturl);
                webRequest.KeepAlive = false;
                webRequest.Method = "GET";
                webRequest.AllowAutoRedirect = true;
                webRequest.CookieContainer = cookies;

                // Retrieve HttpWebResponse
                webResponse = (HttpWebResponse)webRequest.GetResponse();

                // Retrieve stream response and read it to end
                Stream st = webResponse.GetResponseStream();
                StreamReader sr = new StreamReader(st);
                string buffer = sr.ReadToEnd();
            }
Steve Celius
RE:HttpWebRequest login ekstern website 07.02.2011 16:24:19

Hei,

autentiseringen skjer såvide jeg kan se fra server til server, og cookie containeren tilhører serverkoden din. Den cookien vil ikke flyte tilbake til klienten sånn uten videre. Er dette to forskjellige domener? Da er det en rimelig standard SSO utfordring, og må håndteres på en annen måte.

/Steve

Kai Tangen Lunheim
RE:HttpWebRequest login ekstern website 08.02.2011 13:53:55
Takk for svar Steve.
På grunn av tidspress ble jeg nødt til å løse dette med Response.Write(<form ...); og clientside javascript. Men jeg er av den oppfatning av dette er en litt bob bob måte å gjøre det på, og vil undersøke nevnte problemstilling næremere hvis tiden strekker til.

Kai

Copyright (C) 2006 Norwegian .NET User Group
  Powered by EPiServer