Reindirizzare l'utente alla pagina autenticata che utilizza l'autenticazione basata su moduli, utilizzando HTTP Location Header, HttpWebRequest / Response e Response.Cookies.Add ()
-
07-07-2019 - |
Domanda
Devo autenticarmi su un sito usando l'autenticazione tramite moduli e quindi reindirizzare l'utente su quel sito insieme al cookie di sessione. Non ho capito come farlo con successo. Ecco il mio codice finora. Vengo ancora reindirizzato a quella pagina di accesso delle app. Qualsiasi aiuto è molto apprezzato!
protected void Button1_Click(object sender, EventArgs e)
{
string data = "nickname=&login={0}&password={1}&action_login.x=70&action_login.y=14action_login=Login";
string postdata = String.Format(data, "test", "test");
string page = @"http://1.1.1.1/home.asp";
string loginPage = @"http://1.1.1.1/auth.asp";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginPage);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.AllowAutoRedirect = false;
ASCIIEncoding encoding = new ASCIIEncoding(); //encoder
byte[] requestData = encoding.GetBytes(postdata); //encode post data
request.ContentLength = requestData.Length;
//write the post data to the request
Stream requestStream = request.GetRequestStream();
// Send the data.
requestStream.Write(requestData, 0, requestData.Length);
requestStream.Close();
try
{
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
string cookieHeader = response.GetResponseHeader("Set-Cookie");
string cookieValue = cookieHeader.Replace("pp_session_id=", "");
HttpCookie cookie = new HttpCookie("pp_session_id",cookieValue);
cookie.Domain = "1.1.1.1";
cookie.Path = "/";
Response.Clear();
Response.StatusCode = 302;
//Response.AddHeader("Set-Cookie", cookieHeader);
Response.AddHeader("Location",page);
Response.RedirectLocation = page;
Response.Cookies.Add(cookie);
Response.Flush();
}
catch (WebException ex)
{
Response.Write(ex.Message);
}
}
Soluzione
Usa Firebug su Mozilla Firefox per vedere cosa fa esattamente il browser quando accede alla webapp. Quindi simula la stessa sequenza tramite il codice.
In alternativa, puoi utilizzare WireShark per annusare le richieste inviate dal browser.
Una cosa che posso vedere dal tuo codice è che stai aggiungendo esplicitamente il cookie. Non dovresti farlo. È necessario impostare un CookieContainer sulla richiesta, in modo che i cookie vengano inviati con tutte le richieste a quel sito.
spero che sia d'aiuto.
Altri suggerimenti
Cosa c'è di sbagliato nell'uso dei FormsAuthentication
classe? In particolare, hai provato la seguente sequenza (o una sua variante):
FormsAuthentication.
Autentica
();
FormsAuthentication.
SetAuthCookie
();
FormsAuthentication.
RedirectFromLoginPage
();
credo che tu debba fare una richiesta a una pagina autenticata sull'app web remota.
dovrai prendere il cookie che ti dà in modo da avere una sessione valida. ID sessione aspnet passato nel cookie. Quindi dovrai passare il nome utente e la password richiesti per quell'app insieme al cookie che hai ricevuto in modo da avere una sessione autenticata valida.