-----------------PASOS DE INFRAESTRUCUTURA-------------------
1. Simular dominios distintos en nuestro IIS Local. Para lograrlo:
- Nos metemos a:
C:\Windows\System32\drivers\etc\host y colocamos las ultimos lineas creando dos dominios locales:
127.0.0.1 www.testlocalhost1.com
127.0.0.1 www.testlocalhost2.com
3. Probamos que podamos ingresar a nuestros sitios con los dominios creados así:
http://www.testlocalhost1.com/midirectoriovirtual/Default.aspx
http://www.testlocalhost2.com/midirectoriovirtual2/Default.aspx
4. Una vez aseguremos que nuestro sitio esta funcionando... procedemos ahora si a hacer el código:
-----------------PASOS DE CÓDIGO O IMPLEMENTACIÓN-------------------
1. En el sitio que va a enviar las credenciales vamos a crear una pagina que se llame:
Crear una pagina en el sitio desde el cual vamos a enviarle la sesión:
Esta pagina puede llamarse: Redirect.aspx y con su correspondiente Redirect.aspx.cs.
En el aspx vamos a colocar:
///////////////////////
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Redirect.aspx.cs"
Inherits="Redirect" Theme="" StylesheetTheme="" %>
<!DOCTYPE html>
<html>
<head id="Head" runat="server">
</head>
<body>
<form id="form1" runat="server">
<div>
<p>
<input id="hdnStreetCred" runat="server" type="hidden" />
<asp:Button ID="btnTransfer" runat="server" Text="Go" PostBackUrl="http://www.testlocalhost2.com/titanmulticlient2/Recieve.aspx" /></p>
</div>
</form>
</body>
</html>
////////////////////////
en el cs vamos a colocar:
/////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Cryptography;
using System.Threading;
using System.Web.Security;
public partial class Redirect : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
FormsIdentity cIdentity = Page.User.Identity as FormsIdentity;
if (cIdentity != null)
{
this.hdnStreetCred.ID = FormsAuthentication.FormsCookieName;
this.hdnStreetCred.Value = FormsAuthentication.Encrypt(((FormsIdentity)User.Identity).Ticket);
}
}
protected void BtnContinuar_Click(object sender, EventArgs e)
{
Response.Redirect("~/Default.aspx");
}
}
/////////////////////////
Listo... hemos terminado la implementación del sitio que va a enviar la sesión.... Ahora vamos a pasar a la implementación del código en el sitio que va a recibir la sesión, así:
Vamos a crear una página que se llame:
Recieve.aspx que puede contener:
/////////////
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Recieve.aspx.cs" Inherits="Receive" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html>
Y en el cs debe contener:
/////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Cryptography;
using System.Threading;
using System.Web.Security;
public partial class Receive : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
HttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);
if (!Context.User.Identity.IsAuthenticated)
{
Response.Redirect("Login.aspx");
}
else
{
Response.Redirect("Miperfil.aspx");
}
}
}
////////////
Muy bien!, ya hemos terminado la parte del código.... ahora vamos a definir una configuración muy importante en nuestros web.config de cada aplicación:
En el web.config de la aplicación que envia la sesión debemos de colocar:
<forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" cookieless="UseCookies" slidingExpiration="true" timeout="1440" enableCrossAppRedirects="true" protection="All"
path="/" domain=".testlocalhost1.com" />
Y en la etiqueta: system.web
<machineKey validationKey="E0D7098C31ECF04C53AE8A4384BD67FDAC8F2145CA836A69ECE1166E1E0130628833BD9C09B50D13DEC6983FEBF9DE53F13764DDBB85F50DFDC3702710557E74" decryptionKey="FF4CF08FD21691CE5226C7A4A0C67E9B8584CB444E150F99899199EB631007CE" validation="SHA1" decryption="AES" />
------------------
En el web.config de la aplicación que recibe la sesión debemos de colocar:
<forms loginUrl="Default.aspx" name=".ASPXFORMSAUTH" cookieless="UseCookies" slidingExpiration="true" timeout="1440" enableCrossAppRedirects="true" protection="All"
path="/" domain=".testlocalhost2.com" />
y en la etiqueta: system.web
<machineKey validationKey="E0D7098C31ECF04C53AE8A4384BD67FDAC8F2145CA836A69ECE1166E1E0130628833BD9C09B50D13DEC6983FEBF9DE53F13764DDBB85F50DFDC3702710557E74" decryptionKey="FF4CF08FD21691CE5226C7A4A0C67E9B8584CB444E150F99899199EB631007CE" validation="SHA1" decryption="AES" />
Como notan, las configuraciones son identicas y lo único que difiere es el atributo domain del tag forms.
Digamos que sin ir al fondo del como funciona nos damos cuenta de que .NET lo hace practicamente automatico... en el load de la pagina Receive.aspx, si colocamos un punto de interrupción (se puede hacer desde visual estudio en boton derecho sobre sitio web, y attach IIS.), nos daremos cuenta que .NET automaticamente detecta al usuario como logeado. Definitivamente algo muy automatico y maravilloso... je je.
Espero les sirva y no me haya faltado nada.... esto me consumió aprox. unas 16 horas de busqueda en google y desde luego gracias a internet y a personajes colaborativos en al red... desde luego especialmente a craigmoliver que me ayudo con el primer paso.
en la página:
http://stackoverflow.com/questions/72125/how-do-you-pass-an-authenticaticated-session-between-app-domains
Notas finales:
Por seguridad y para que funcione la sesión debe guardarse en cookies, no por Uri... por eso el atributo llamado cookieless debe estar en: UseCookies.
Para el tema del machine key se puede utilizar una herramienta online para crear el machinekey que recordebemos debe ser el mismo en los sitios web que compartan sesión. La url es:
http://aspnetresources.com/tools/machineKey
Espero les sirva.
Sean felices! :) Y siéntanse libres de opinar ;)
No hay comentarios:
Publicar un comentario