SSO ASP.NET to WordPress: ASP.NET to Wordpress Single Sign On with HttpWebRequest

Hola a todos.

En este post, voy a tratar de explicar cómo se puede establecer un 'Single Sign On' (SSO) entre una aplicación web ASP.NET (AppW) y un WordPress (WP). El motivo que me ha llevado a compartir esta idea con todos vosotros, viene promovido por la escasa información completa que he encontrado en internet.

Aunque han sido numerosas las páginas que he encontrado con datos sobre cómo hacerlo, en ninguna explicaban el proceso completo y ,en la mayoría de los casos, sólo se centraban en la autenticación desde el lado de la aplicación AppW.

Debido a que el post es muy largo, lo he dividido en tres partes, y para no mezclar explicación con codigo podeís encontrar directamente los fuentes en los siguientes apartados:
· SSO ASP.NET to WordPress: PHP Souce Code
· SSO ASP.NET to WordPress: ASP.NET Souce Code

NOTA: En los ejemplos que encontré, la autenticación desde la aplicación AppW permitía al usuario trabajar desde el WP sin necesidad de registrarse de nuevo. Pero si la situación era la inversa, la aplicación web no detectaba que el usuario estaba registrado, y éste se tenía que autenticar de nuevo. En este post, os indico cómo poder lograr que ambos procesos funcionen como uno sólo.

PARA EMPEZAR, VAMOS A PONERNOS EN SITUACIÓN...


Lo que deseamos reproducir aquí, es un sistema de autenticación doble que permita a los usuarios registrarse en un WP o en la AppW, y poder alternar la navegación entre ambas sin que ello afecte al estado del login.

Nuestro objetivo es tener las cookies de autenticación bajo un mismo dominio, de forma que sean accesibles desde cualquier aplicación que esté en el mismo dominio. Por tanto, lo que tenemos que hacer es generar un sistema que genere las cookies que usa el WP y que nos permita gestionarlas desde la aplicación AppW.

El principal problema con el que nos encontramos al intentar registrarnos en alguna de las aplicaciones anteriores, es que las cookies que se generan en uno u otro sistema, no se pueden 'compartir' fácilmente entre ellas. De hecho, y por la privacidad preestablecida, esto no se puede hacer.... ¿o sí?

Condiciones Básicas para que todo funcione:
Las condiciones básicas que debemos tener para que el sistema que vamos a montar funcione, se podrían resumir en los siguientes puntos:
· Trabajar sobre un dominio propio, con acceso completo.
· Tener instalado un WP en ese dominio (o un subdominio)
· Tener una AppW instalada en ese dominio (o un subdominio)

Es muy importante que ambas aplicaciones corran bajo el mismo dominio, dado que de lo contrario, nunca podremos compartir las cookies entre ellas.

Supuestos iniciales:
Supongamos que tenemos toda la infraestructura montada, y que nuestras aplicaciones de ejemplo corren bajo el dominio de pruebas: http://mydomain.com
· el WP bajo wp.mydomain.com
· y la AppW bajo app.mydomain.com

Lo único que nos queda es generar las cookies bajo el dominio '.mydomain.com', y que sean por tanto, visibles desde ambas aplicaciones.

LÓGICA DE CLASES:

A partir de este punto, lo que vamos a ver es cómo debemos codificar los distintos elementos necesarios que nos van a permitir cumplir nuestro objetivo, el SSO.

Para ello, vamos a necesitar dos archivos que contendrán todo el código que necesitamos. Primero explicaré en qué consiste cada archivo, y luego veremos el código con algo más de profundidad.

1º Archivo PHP:
Este será el archivo que tendremos que subir al directorio raiz de nuestro WP, y que contendrá las sentencias necesarias para averiguar si: un usuario está conectado, si hay que desconectar a un usuario, o en qué estado se encuentra el wordpress (por si existe un usuario autenticado).

En el código de este archivo he incluido una función, que escribe la respuesta obtenida en formato XML. Aunque se podría establecer la salida de varias maneras, he preferido utilizar este formato porque facilita mucho la gestión posterior desde el lado .NET

De esta forma, el archivo final quedaría con la siguiente estructura:
- archivos de inclusión de WP
- código con la función para parsear la información obtenida
- sentencia swich, que puede tomar los valores "logged_status", "logout", y "loggin". Aquí es donde se encuentra la programación que realizará cada una de las acciones que serán solicitadas desde la AppW

2º Archivo de Clases .NET:
Este archivo de clases será el que contenga toda la lógica de conexión y autenticación entre nuestra AppW y nuestro WP. En principio lo he codificado todo en un único archivo para su mejor comprensión, aunque como bien sabéis, se debería haber realizado un archivo único por cada clase utilizada (principios básicos SOLID).

En este archivo, lo que encontraremos serán tres clases básicas y un modelo de datos:
· LoginUser: modelo que almacenará los datos devueltos por el WP y que se utiliza en la lógica de login de la AppW
· LoginWPMethods: clase principal con los métodos para conectar, desconectar o averiguar el estado del usuario en WP
· LoginWPException: clase para controlar las posibles excepciones que tengamos a la hora de autenticar usuarios
· LoginWPHelpers: clase con métodos auxiliares utilizados en la clase principal

IMPLEMENTACION:

Una vez generados los archivos, tendremos que realizar los siguientes pasos:

WORDPRESS
colgar en el directorio raiz del WP el archivo PHP.
activar el dominio para las cookies de forma que sean accesibles a todos los subominios. Esto se puede hacer, o bien instalando el plugin 'root Cookie' (puedes encontrarlo aqui), o bien pegando las siguientes líneas en el archivo wp-config.php:

define('LOGGED_IN_COOKIE', 'login_cookie_name');
define('AUTH_COOKIE','auth_cookie_name');
define('COOKIE_DOMAIN', '.example.com');
define('COOKIEHASH', 'random_hash_here');


APLICACIÓN WEB
Incluir el archivo de clases al proyecto, y añadir las referencias a la clase necesarias.
2º LOGIN:
· Para controlar el login del WP a AppW, debes incluir el código que llame a la función 'LoggedStatusWordpress' con la ruta del WP, y el objeto que te devolverá, te indicará si existe un usuario registrado o no.
· Para controlar el login en la AppW y actuar en consecuencia contra el WP, hay que llamar a la función 'LoginToWordpress'. El objeto devuelto indicará si el usuario introducido existe o no, y en caso correcto, realizará el login en el WP.
· Para desconectar, realizar la llamada a 'LogoutToWordpress', y el usuario será desconectado del WP
A partir de este punto, sólo quedaría implementar la lógica de acceso por autenticación de la applicación web, de forma que se mantengan autenticados a los usuarios mediante el formato <authentication mode="form" /> de .NET.


Debido a que el post es muy largo, y para no mezclar explicación con codigo, podeís encontrar directamente el código en este post en:

· SSO ASP.NET to WordPress: PHP Souce Code
· SSO ASP.NET to WordPress: ASP.NET Souce Code


Si os ha gustado y sobre todo, si os ha servido, no dudeis en valorarlo! +1

Un saludo a todos!

No hay comentarios:

Publicar un comentario