Hola Gente:
Estamos implementando en una aplicación web ASP.NET Web Forms Identidad Federada con Azure (ACS), y actualmente tenemos 2 Identity Providers: ADFS y un IdP propio. Algo que pensé que sería trivial fue la implementación del Logout. Pero no. En la mayoría de los sitios y ejemplos encuentro el siguiente código para realizar el signout federado: FormsAuthentication.SignOut(); var authModule = FederatedAuthentication.WSFederationAuthenticationModule; WSFederationAuthenticationModule.FederatedSignOut(new Uri(authModule.Issuer), new Uri(authModule.Realm)); Cuando se ejecuta el método FederatedSignOut, se envía un mensaje wsingout1.0 al IdP y una URL de retorno (wreply). El problema es que ADFS simplemente ignora el parámetro wreply. Después del signout no hay oportunidad de hacer un redirect y ADFS (o ACS) entrega una página como esta: https://tlsadmin.accesscontrol.windows.net/v2/wsfederation?wa=wsignoutcleanu p1.0 <https://tlsadmin.accesscontrol.windows.net/v2/wsfederation?wa=wsignoutclean up1.0&wreply=http://localhost:2600/Account/SignIn> &wreply=http://localhost:2600/Account/SignIn Aquí hay varios posts describiendo el mismo problema: http://www.mygreatwindowsazureidea.com/forums/40626-windows-azure-appfabric- feature-voting/suggestions/2356087-support-redirection-after-sign-out-suppor t-wreply http://haishibai.blogspot.com.ar/2012/08/sign-out-from-identity-providers-wh en.html En el último post se propone una solución medio trucha forzando un request wasignout1.0 a través de un tag IMG y capturando el error con JS para luego redirigir a alguna página propia. //Controller public ViewResult LogOff() { FormsAuthentication.SignOut(); WSFederationAuthenticationModule fam = FederatedAuthentication.WSFederationAuthenticationModule; fam.SignOut(true); return View("LogOff", new string[]{"https://login.live.com/login.srf?wa=wsignout1.0"}); } //View <img src="@Model[0]" onerror="window.location='/';" /> Inspirado en esto cree otra solución que considero un poco mejor: FormsAuthentication.SignOut(); var authModule = FederatedAuthentication.WSFederationAuthenticationModule; var url = WSFederationAuthenticationModule.GetFederationPassiveSignOutUrl(authModule.I ssuer, authModule.Realm, null); var request = WebRequest.Create(url); request.GetResponse(); Response.Redirect("YOUR URL"); Básicamente, en lugar de forzar un request con un tag IMG estoy usando un WebRequest. He probado esto y funciona, puedo redireccionar después del FederatedSignOut. Me gustaría saber si alguien a lidiado con esto y conoce alguna otra forma de resolver el problema. Por otro lado, en muchos posts veo que llaman también al método FormsAuthentication.SignOut(), es realmente necesario esto? Bueno, espero haber dejado suficiente detalle. Cualquier comentario, sugerencia o experiencia que quieran compartir será bienvenido. Saludos, Gustavo Azcona PD: Quizas con www.auth10.com del magnánimo de Mawolo no pasan estas cosas, pero nuestro cliente ya ha elegido ACS.
