2010-12-10 43 views
2

Je tente de créer une expérience de connexion unique entre un site asp.net et un site wordpress en utilisant une simple méthode POST de formulaire. J'ai construit une simple page php qui utilise les fonctions wordpress natives wp_insert_user et wp_signon pour créer un compte utilisateur dans mysql db et les signer. Dans mon code de page asp.net 'create new user', j'utilise la méthode post d'un HttpWebRequest pour envoyer les informations requises à la page php.ASP.NET à Wordpress SSO avec HttpWebRequest

Cela fonctionne presque! Le nouvel utilisateur wordpress est créé dans la base de données mysql, mais ils ne sont pas connectés. Comment puis-je obtenir wordpress pour les enregistrer?

MISE À JOUR 29/11/11. J'ai ajouté le code que j'ai utilisé pour que cela fonctionne. Voir ci-dessous

Voici mon HttpWebRequest

 Public Sub LoginToWordpress() 
     'This enables single sign on between our asp.net site and wordpress. 
     Try 
      'get the values 
      Dim uid As String = TxtLogin.Text 
      Dim pwd As String = TxtPassword.Text 

      'format and encode the input data 
      Dim encoding As New ASCIIEncoding() 
      Dim postData As String = ("&UserName=" & uid) 
      postData += ("&Pwd=" & pwd) 
      Dim data As Byte() = encoding.GetBytes(postData) 
      Dim cc As New CookieContainer() 

      'Prepare web request... 
      Dim myRequest As HttpWebRequest = WebRequest.Create("http://www.mywebsite.com/speciallogin.php") 
      myRequest.Method = WebRequestMethods.Http.Get 
      myRequest.Method = "POST" 
      myRequest.ContentType = "application/x-www-form-urlencoded" 
      myRequest.ContentLength = data.Length 
      myRequest.CookieContainer = cc 
      Dim newStream As Stream = myRequest.GetRequestStream() 

      'submit the php form for BuddyPress signup 
      newStream.Write(data, 0, data.Length) 
      newStream.Close() 

      'Get the response 
      Dim myResponse As HttpWebResponse = myRequest.GetResponse() 
      Dim reader As New StreamReader(myResponse.GetResponseStream()) 

      'Look for cookies in the response 
      If Not myResponse.Cookies.Count = 0 Then 
       For Each c As Cookie In myResponse.Cookies 

        'Write the wordpress cookie to the browser 
        Dim cookiename As String = c.Name 
        Dim cCookie As New HttpCookie(cookiename) 
        cCookie.Value = c.Value 
        cCookie.Expires = c.Expires 
        cCookie.Domain = ".mywebsite.com" 
        cCookie.Path = "/" 
        Response.Cookies.Add(cCookie) 
       Next 
      End If 
      myResponse.Close() 

     Catch ex As Exception 
      Response.Write(ex) 
     End Try 
    End Sub 

Voici la page PHP (speciallogin.php)

<?PHP 
    include 'wp-load.php'; 

    require_once(ABSPATH . WPINC . '/user.php'); 
    require_once(ABSPATH . WPINC . '/pluggable.php'); 

    //get the variables from the post of another page 
    $u_username = $_POST['UserName']; 
    $u_password = $_POST['Pwd']; 

    //build the array 
    $creds = array(); 
    $creds['user_login'] = $u_username; 
    $creds['user_password'] = $u_password; 
    $creds['remember'] = true; 

    //log the user in 
    $user = wp_signon($creds, false); 
    if (is_wp_error($user)) 
     echo $user->get_error_message(); 

    //see what happened 
     if (is_user_logged_in()) { 
      echo'log in failed'.'<br>'; 
     } else { 
      echo'login success!"<br>'; 
     } 

     wp_get_cookie_login() ; 

     print_r($_COOKIE); 

    ?> 
+0

s'il vous plaît partager avec le monde si vous parvenez à obtenir ce travail :) – devrooms

+0

N o s'inquiète. Si je le fais fonctionner, je vais bloguer, tweeter, et le crier d'une montagne – Mtblewis

Répondre

2

D'après ce que je peux voir, votre code côté serveur communique la demande wp-load.php qui crée et enregistre l'utilisateur (dans la session de la requête Web côté serveur).

Je beleive que wordpress renvoyer un cookie sur chaque page, donc vous devez extraire les cookies du WebResponse, et envoyer ces cookies retour de votre page asp.net, ainsi qu'un

Response.Redirect("http://localhost:1350/wp/");

Je suis incapable de tester ce que je n'ai pas installer WP pour le moment, et je ne pas utiliser VB.net mais je pense que ce serait quelque chose comme:

Dim cookies As New CookieContainer() 
Dim myRequest As HttpWebRequest = WebRequest.Create("http://localhost:1350/wpComm/createWPaccount.php") 
myRequest.Method = "POST" 
myRequest.ContentType = "application/x-www-form-urlencoded" 
myRequest.ContentLength = data.Length 
myRequest.CookieContainer = cookies;  
Dim newStream As Stream = myRequest.GetRequestStream() 

newStream.Write(data, 0, data.Length) 
newStream.Close() 

For Each c As Cookie In cookies 
    Response.Cookies.Add(c) 
Next 

Response.Redirect("http://localhost:1350/wp/") 
+0

Il s'avère que j'avais besoin d'ajouter un HttpWebResponse pour obtenir des informations à partir de mon formulaire php. Cependant, le nombre de cookies est 0 lorsque je l'exécute. Aucune suggestion? – Mtblewis

+0

aura besoin de le tester, donc je vais trier une machine virtuelle ... :) – devrooms

+0

Je l'ai compris! La réponse retournait un system.net.cookie plutôt qu'un system.web.httpcookie. J'ai créé un nouveau httpcookie en utilisant les données de l'autre cookie et cela a fonctionné. Je vais documenter les étapes et poster le lien ici quand c'est fait. – Mtblewis