Antes o después, siempre nos encontramos con la necesidad de ‘clusterizar’ nuestras aplicaciones Web. Para esto, sin dudad ninguna, tenemos mucha documentación en la MSDN y demás portales de ayuda a desarroladores. aunque para el caso de aplicaciones haciendo uso de Windows Identity Foundation esta cantidad de ayuda no es tan grande, ni mucho menos. Por ello, a lo largo de la siguiente entrada intentaremos ver como preparar nuestras aplicaciones para que los módulos de WIF soporten WebFarms.
WIF 3.5
El principal escollo con el que nos encontramos para mover una aplicación a una Web Farm consiste en la encriptación de la cookie, con su consiguiente token de wif, usando DPAPI. Como sabrá, DPAPI es dependiente de la máquina y por lo tanto, si una petición de un usuario se dirigiera hasta otro nodo del cluster este no sería capaz de realizar la desencriptación y el consiguiente tratamiento de la cookie. Por suerte, WIF nos permite modificar los módulos encargados de realizar estas tareas, para, poder decirle que use algún mecanismo de encriptado no dependiente de la máquina, como por ejemplo podría ser un RSA. La única pega, es que esto no lo podemos hacer mediante configuración y por lo tanto, tendremos que tocar nuestro código actual para mover una aplicación a una Web Farm. Los pasos a realizar son los siguientes:
Subscribirnos a la creación de la configuración en nuestro punto de inició de la aplicación
1 |
FederatedAuthentication.ServiceConfigurationCreated += onServiceConfigurationCreated; |
Crear nuestro CookieTransform que haga uso de RSA en vez de DPAPI
1 2 3 4 5 6 |
var sessionTransforms = <span class="kwrd">new</span> List<CookieTransform>(<span class="kwrd">new</span> CookieTransform[] { <span class="kwrd"> new</span> DeflateCookieTransform(), <span class="kwrd"> new</span> RsaEncryptionCookieTransform(e.ServiceConfiguration.ServiceCertificate), <span class="kwrd"> new</span> RsaSignatureCookieTransform(e.ServiceConfiguration.ServiceCertificate) }); |
Establecer un SessionSecurityTokenHandler que haga uso de este mecanismo de transformación:
1 |
SessionSecurityTokenHandler sessionHandler = <span class="kwrd">new</span> SessionSecurityTokenHandler(sessionTransforms.AsReadOnly()); |
1 |
e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler); |
WIF 4.5
Por suerte, en WIF 4.5 todo este trabajo es realmente mucho más sencillo gracias a nuestra herramienta “Identity and Access Tool” de la que ya hablamos en otras ocasiones. Si nos fijamos en la misma, dentro de la pestaña de configuración tenemos un simple check que nos permite poner nuestra aplicación válida para una Web Farm.
Con este sencillo paso, sin tener que poner una sola linea de código ya tenemos el trabajo anterior resuelto. ¿ Como es posible esto? Pues bien, la respuesta está en que WIF ya tiene ahora, en esta nueva versión, un security token handler con las transformaciones adecuadas para que funcionen en una WebFarm, basta con ver los cambios realizados en nuestra sección IdentityModel para ver que ha pasado.
1 2 3 4 |
<securityTokenHandlers> <add type=<span class="str">"System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler"</span> /> <remove type=<span class="str">"System.IdentityModel.Tokens.SessionSecurityTokenHandler"</span> /> </securityTokenHandlers> |
Si observa el elemento XML anterior verá como, tal y como comentábamos, se ha cambiado el SessionSecurityTokenHandler por defecto por un MachineKeySessionSecurityTokenHandler capaz de funcionar en una WebFarm.
Ha sido una entrada corta, pero espero que os resulte de interés…
Un saludo
Unai