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.

 

Responder a