Tal y como se indica en el post principal, los dos archivos necesarios para el SSO son un PHP (al que llamaré wp-login-asp.php - el nombre puede ser modificado al gusto de cada uno -) y un archivo .cs con las clases del proyecto .NET cuya explicación se encuentra en el post SSO ASP.NET to WordPress: ASP.NET Souce Code.
ARCHIVO wp-login-asp.php
La función principal de este archivo es ejecutar las solicitudes efectuadas desde la Aplicación Web, y realizar las llamadas a los métodos del WP que serán las encargadas de loguear, desloguear o solicitar el estado del login, del usuario actual.
Este archivo debe estar ubicado en el directorio raiz del WP, al mismo nivel que el archivo wp-login.php.
Si analizamos el código fuente, podremos encontrar los siguientes elementos:
· Función GetXmlData:
Se trata de una función auxiliar, que devuelve una respuesta a la aplicación en formato Xml. Aunque no es necesario que la respuesta se devuelva en este formato, he preferido utilizarlo porque permite una mayor facilidad a la hora de tratar los datos devueltos desde el lado de la AppW asp.net. Simplemente es un wrapper que formatea la información de salida del WP.
· Sentencia SWITCH:
Ejecuta las acciones necesarias en funcion del parametro "Action" enviado desde la AppW. Tal y como cada opcion indica, cada apartado se encarga de: averiguar el estado del usuario actual ('logged_status'), desloguear al usuario actual ('logout') eliminando las cookies de registro, ó autenticar al usuario actual ('loggin').
NOTA IMPORTANTE: Todas estas funciones se ejecutan a petición de la AppW, siendo independientes del proceso de login del WP. Si un usuario se autentica directamente en el WP, se generarán las cookies de su registro, y posteriormente las tendremos que recoger del lado .NET y hacer la llamada a la acción 'logged_status' para obtener los datos del usuario registrado en ese momento. En el .NET Source Code, explico el proceso con más detenimiento.
Puedes obtener más información en:
· SSO ASP.NET to WordPress: Single Sign On
· SSO ASP.NET to WordPress: ASP.NET Souce Code
Un saludo a todos!
[...]
ARCHIVO wp-login-asp.php
La función principal de este archivo es ejecutar las solicitudes efectuadas desde la Aplicación Web, y realizar las llamadas a los métodos del WP que serán las encargadas de loguear, desloguear o solicitar el estado del login, del usuario actual.
Este archivo debe estar ubicado en el directorio raiz del WP, al mismo nivel que el archivo wp-login.php.
<?PHP
include 'wp-load.php';
require_once( ABSPATH . WPINC . '/user.php' );
require_once( ABSPATH . WPINC . '/pluggable.php' );
function GetXmlData($data_user, $data_error_num, $data_error_text)
{
//make XML output
$temp_xml = '<?xml version="1.0" encoding="UTF-8"?>';
$temp_xml .= '<object>';
if ($data_error_num<=0) {
//echo'login failed!';
$temp_xml .= '<is_valid>'.$data_error_num.'</is_valid>';
$temp_xml .= '<error_message>'.$data_error_text.'</error_message>';
} else {
//set xml data
$temp_xml .= '<is_valid>1</is_valid>';
$temp_xml .= '<error_message></error_message>';
$temp_xml .= '<id>'.$data_user->ID.'</id>';
$temp_xml .= '<user_login>'.$data_user->user_login.'</user_login>';
$temp_xml .= '<user_pass>'.$data_user->user_pass.'</user_pass>';
$temp_xml .= '<user_displayname>'.$data_user->user_firstname.
' '.$data_user->user_lastname.'</user_displayname>';
$temp_xml .= '<user_nicename>'.$data_user->user_nicename.
'</user_nicename>';
$temp_xml .= '<user_email>'.$data_user->user_email.'</user_email>';
}
$temp_xml .= '</object>'; //close xml data
return $temp_xml;
}
//get the variables from the post of another page
$u_action = $_REQUEST['Action'];
$u_username = $_REQUEST['UserName'];
$u_password = $_REQUEST['Pwd'];
//set DATA XML output variable to export
$data = "";
//study cases
switch ($u_action){
case "logged_status":
$current_user = wp_get_current_user();
if ( 0 == $current_user->ID ) {
$data = GetXmlData(null, 0, 'Current user is not logged');
} else {
$data = GetXmlData($current_user, 1, '');
}
break;
case "logout":
wp_logout();
wp_clear_auth_cookie();
$data = GetXmlData(null, 0, 'El usuario actual ha finalizado su sesión');
break;
case "loggin":
//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 );
$error_num;
$error_msg = '';
if ( is_wp_error($user) )
{
$error_num = -1;
$error_msg = $user->get_error_message();
} else {
$error_num = 1; //no error
}
$data = GetXmlData($user, $error_num, $error_msg);
break;
default:
$data = GetXmlData(null, -1, 'No action is defined');
break;
}
print_r($data);
?>
include 'wp-load.php';
require_once( ABSPATH . WPINC . '/user.php' );
require_once( ABSPATH . WPINC . '/pluggable.php' );
function GetXmlData($data_user, $data_error_num, $data_error_text)
{
//make XML output
$temp_xml = '<?xml version="1.0" encoding="UTF-8"?>';
$temp_xml .= '<object>';
if ($data_error_num<=0) {
//echo'login failed!';
$temp_xml .= '<is_valid>'.$data_error_num.'</is_valid>';
$temp_xml .= '<error_message>'.$data_error_text.'</error_message>';
} else {
//set xml data
$temp_xml .= '<is_valid>1</is_valid>';
$temp_xml .= '<error_message></error_message>';
$temp_xml .= '<id>'.$data_user->ID.'</id>';
$temp_xml .= '<user_login>'.$data_user->user_login.'</user_login>';
$temp_xml .= '<user_pass>'.$data_user->user_pass.'</user_pass>';
$temp_xml .= '<user_displayname>'.$data_user->user_firstname.
' '.$data_user->user_lastname.'</user_displayname>';
$temp_xml .= '<user_nicename>'.$data_user->user_nicename.
'</user_nicename>';
$temp_xml .= '<user_email>'.$data_user->user_email.'</user_email>';
}
$temp_xml .= '</object>'; //close xml data
return $temp_xml;
}
//get the variables from the post of another page
$u_action = $_REQUEST['Action'];
$u_username = $_REQUEST['UserName'];
$u_password = $_REQUEST['Pwd'];
//set DATA XML output variable to export
$data = "";
//study cases
switch ($u_action){
case "logged_status":
$current_user = wp_get_current_user();
if ( 0 == $current_user->ID ) {
$data = GetXmlData(null, 0, 'Current user is not logged');
} else {
$data = GetXmlData($current_user, 1, '');
}
break;
case "logout":
wp_logout();
wp_clear_auth_cookie();
$data = GetXmlData(null, 0, 'El usuario actual ha finalizado su sesión');
break;
case "loggin":
//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 );
$error_num;
$error_msg = '';
if ( is_wp_error($user) )
{
$error_num = -1;
$error_msg = $user->get_error_message();
} else {
$error_num = 1; //no error
}
$data = GetXmlData($user, $error_num, $error_msg);
break;
default:
$data = GetXmlData(null, -1, 'No action is defined');
break;
}
print_r($data);
?>
Si analizamos el código fuente, podremos encontrar los siguientes elementos:
· Función GetXmlData:
Se trata de una función auxiliar, que devuelve una respuesta a la aplicación en formato Xml. Aunque no es necesario que la respuesta se devuelva en este formato, he preferido utilizarlo porque permite una mayor facilidad a la hora de tratar los datos devueltos desde el lado de la AppW asp.net. Simplemente es un wrapper que formatea la información de salida del WP.
· Sentencia SWITCH:
Ejecuta las acciones necesarias en funcion del parametro "Action" enviado desde la AppW. Tal y como cada opcion indica, cada apartado se encarga de: averiguar el estado del usuario actual ('logged_status'), desloguear al usuario actual ('logout') eliminando las cookies de registro, ó autenticar al usuario actual ('loggin').
NOTA IMPORTANTE: Todas estas funciones se ejecutan a petición de la AppW, siendo independientes del proceso de login del WP. Si un usuario se autentica directamente en el WP, se generarán las cookies de su registro, y posteriormente las tendremos que recoger del lado .NET y hacer la llamada a la acción 'logged_status' para obtener los datos del usuario registrado en ese momento. En el .NET Source Code, explico el proceso con más detenimiento.
Puedes obtener más información en:
· SSO ASP.NET to WordPress: Single Sign On
· SSO ASP.NET to WordPress: ASP.NET Souce Code
Un saludo a todos!