2009-09-17 6 views
2

Je dois m'authentifier sur un site à l'aide de l'authentification par formulaires, puis rediriger l'utilisateur vers ce site avec le cookie de session. Je n'ai pas compris comment réussir cela. Voici mon code jusqu'à présent. Je suis toujours redirigé vers la page de connexion de cette application. Toute aide est très appréciée!Rediriger l'utilisateur vers une page authentifiée qui utilise l'authentification par formulaires, en utilisant HTTP Location Header, HttpWebRequest/Response et Response.Cookies.Add()


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); 
} 
} 
+0

Pourriez-vous s'il vous plaît partager comment vous avez finalement résolu cela. Je suis en train de mettre en place une sorte de système de connexion unique et je suis coincé ici. J'ai besoin de connecter automatiquement un utilisateur avec des informations d'identification connues. –

Répondre

1

Utilisez Firebug sur Mozilla Firefox pour voir ce que exactement le navigateur fait lors de la connexion à la webapp. Puis simuler la même séquence à travers le code. Ou, vous pouvez utiliser wireshark pour renifler les demandes envoyées par le navigateur.

Une chose que je peux voir à partir de votre code, c'est que vous ajoutez le cookie explicitement. Vous ne devriez pas faire ça. Vous devez définir un CookieContainer sur la demande, afin que les cookies soient envoyés avec toutes les demandes à ce site.

espérons que cela aide.

+0

Ok, en relisant votre question, je pense que je ne l'ai pas bien compris. Qu'est-ce que vous essayez de faire, c'est d'utiliser un man-in-the-middle, qui fait l'authentification FBA à l'application ASP back-end, et transmet ensuite ce cookie au client. Ce faisant, il définit le domaine et le chemin de manière appropriée. Je vous suggère de faire un sniff réseau, entre votre application asp.net et l'application ASP distant, ainsi que d'un navigateur allant directement à l'application ASP. Et voyez quelle est la différence dans les cookies/urls etc – feroze

+0

Est-il possible que le serveur ASP code le nom d'hôte du client (dans ce cas l'application asp.net) dans le cookie, donc il rejette la requête quand elle vient le client. – feroze

+0

C'est exactement ce que j'essaie de faire. J'ai analysé le trafic avec fiddler2, la seule chose manquante était l'en-tête P3P, mais il ne semble pas attacher le cookie à la demande de redirection. L'application ASP est une tierce partie, je n'ai donc aucune idée de la façon dont elle crée l'identifiant de session. La raison pour laquelle j'étudie cela est que j'écris un proxy inverse et que je ne parviens pas à faire fonctionner une applet Java spécifique, donc je voudrais lancer une connexion directe pour l'utilisateur sans qu'ils aient à s'authentifier . –

1

Quel est le problème avec l'utilisation de la classe FormsAuthentication? En particulier, avez-vous essayé la séquence suivante (ou une variante de celui-ci):

FormsAuthentication.Authenticate();

FormsAuthentication.SetAuthCookie();

FormsAuthentication.RedirectFromLoginPage();

+0

Parce que le site distant n'est pas une application ASP.NET –

0

Je crois que vous devez faire une demande à une page authentifiée sur l'application web à distance.

vous devrez saisir le cookie qu'il vous donne afin que vous ayez une session valide. L'identifiant de session aspnet est passé dans le cookie. Ensuite, vous devrez passer le nom d'utilisateur et le mot de passe requis pour cette application avec le cookie que vous avez reçu afin que vous ayez une session authentifiée valide.

Questions connexes