ASP.NET для Wordpress SSO с HttpWebRequest - PullRequest
2 голосов
/ 10 декабря 2010

Я пытаюсь создать единый вход между сайтом asp.net и сайтом WordPress, используя простой метод POST.Я создал простую страницу php, которая использует встроенные функции wordpress wp_insert_user и wp_signon для создания учетной записи пользователя в базе данных mysql и входа в нее. В моем коде страницы asp.net 'create new user' позади я использую метод postHttpWebRequest для отправки необходимой информации на страницу php.

Это почти работает!Новый пользователь WordPress создается в базе данных MySQL, но они не вошли в систему. Как я могу получить WordPress для входа в систему?

ОБНОВЛЕНИЕ 29/11/11.Я добавил код, который использовал, чтобы это работало.См. Ниже

Вот мой 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

Вот страница 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);

    ?>

1 Ответ

2 голосов
/ 10 декабря 2010

Насколько я вижу, ваш код на стороне сервера отправляет запрос в wp-load.php, который создает и регистрирует пользователя (в сеансе веб-запроса на стороне сервера).

IПоверьте, что WordPress будет отправлять куки на каждой странице, поэтому вам нужно будет извлечь куки с WebResponse и отправить эти куки обратно со страницы asp.net вместе с

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

Я не могу проверить это, так как в данный момент у меня нет установленного WP, и я не использую VB.net, но я думаю, что это будет выглядеть примерно так:

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/")
...