windows azure acs

windows - Salir del servicio de control de acceso con STS personalizado



azure acs (2)

Estoy usando el servicio de control de acceso de Windows azure con STS personalizado. Puedo iniciar sesión en mi aplicación a través de ACS, pero tengo problemas con la función de cierre de sesión. He intentado este código en mi aplicación.

WSFederationAuthenticationModule fam = FederatedAuthentication.WSFederationAuthenticationModule; try { FormsAuthentication.SignOut(); } finally { fam.SignOut(true); } Page.Response.Redirect("default.aspx");

Pero parece que desconecta al usuario de ACS pero no del STS personalizado. ¿Qué debo hacer para desconectarme de STS? ¿Dónde podría estar el problema en la aplicación (RP), ACS o en STS?

Creo que ACS debería solicitar al STS personalizado que cierre la sesión del usuario, pero parece que no lo hace. Lo que me estoy perdiendo?


La actualización de ACS de diciembre de 2012 incluye soporte para el inicio de sesión único federado:

Usando el protocolo WS-Federation. Las aplicaciones web que usan ACS para habilitar el inicio de sesión único (SSO) con proveedores de identidad que usan el protocolo WS-Federation ahora pueden aprovechar las capacidades de sesión única. Cuando un usuario cierra sesión en una aplicación web, ACS puede firmar automáticamente al usuario fuera del proveedor de identidad y de otras aplicaciones de terceros que utilizan el mismo proveedor de identidad.

Esta característica es habilitada para los proveedores de identidad de WS-Federation, incluidos Active Directory Federation Services 2.0 y Windows Live ID (cuenta de Microsoft). Para habilitar el inicio de sesión único, ACS realiza las siguientes tareas para los puntos finales del protocolo WS-Federation:

  • ACS reconoce los mensajes wsignoutcleanup1.0 de los proveedores de identidad y responde enviando mensajes wsignoutcleanup1.0 a las aplicaciones de terceros.

  • ACS reconoce wsignout1.0 y los mensajes de respuesta de las aplicaciones de terceros confiantes y responde enviando los mensajes de wsignout1.0 a los proveedores de identidad y los mensajes de wsignoutcleanup1.0 a las aplicaciones de terceros.

Desde el ejemplo de código: ASP.NET MVC 4 con cierre de sesión federado , implemente una acción como esta para desconectarse de ACS:

(Tenga en cuenta que Windows Identity Foundation ahora está incorporado en .NET Framework 4.5, por eso los nuevos espacios de nombres a continuación)

using System.IdentityModel.Services; using System.IdentityModel.Services.Configuration; public ActionResult Logout() { // Load Identity Configuration FederationConfiguration config = FederatedAuthentication.FederationConfiguration; // Get wtrealm from WsFederationConfiguation Section string wtrealm = config.WsFederationConfiguration.Realm; string wreply; // Construct wreply value from wtrealm (This will be the return URL to your app) if (wtrealm.Last().Equals(''/'')) { wreply = wtrealm + "Logout"; } else { wreply = wtrealm + "/Logout"; } // Read the ACS Ws-Federation endpoint from web.Config // something like "https://<your-namespace>.accesscontrol.windows.net/v2/wsfederation" string wsFederationEndpoint = ConfigurationManager.AppSettings["ida:Issuer"]; SignOutRequestMessage signoutRequestMessage = new SignOutRequestMessage(new Uri(wsFederationEndpoint)); signoutRequestMessage.Parameters.Add("wreply", wreply); signoutRequestMessage.Parameters.Add("wtrealm", wtrealm); FederatedAuthentication.SessionAuthenticationModule.SignOut(); string signoutUrl = signoutRequestMessage.WriteQueryString(); return this.Redirect(signoutUrl); }


Creé un método de ayuda para hacer FederatedSignout, con comentarios en el código de lo que descubrí en el camino (hth)

public static void FederatedSignOut(string reply = null) { WSFederationAuthenticationModule fam = FederatedAuthentication.WSFederationAuthenticationModule; // Native FederatedSignOut doesn''t seem to have a way for finding/registering realm for singout, get it from the FAM string wrealm = string.Format("wtrealm={0}", fam.Realm); // Create basic url for signout (wreply is set by native FederatedSignOut) string signOutUrl = WSFederationAuthenticationModule.GetFederationPassiveSignOutUrl(fam.Issuer, null, wrealm); // Check where to return, if not set ACS will use Reply address configured for the RP string wreply = !string.IsNullOrEmpty(reply) ? reply : (!string.IsNullOrEmpty(fam.Reply) ? fam.Reply : null); WSFederationAuthenticationModule.FederatedSignOut(new Uri(signOutUrl), !string.IsNullOrEmpty(wreply) ? new Uri(wreply) : null); // Remarks! Native FederatedSignout has an option for setting signOutUrl to null, even if the documentation tells otherwise. // If set to null the method will search for signoutUrl in Session token, but I couldn''t find any information about how to set this. Found some Sharepoint code that use this // Michele Leroux Bustamante had a code example (from 2010) that also uses this form. // Other examples creates the signout url manually and calls redirect. // FAM has support for wsignoutcleanup1.0 right out of the box, there is no need for code to handle this. // That makes it even harder to understand why there are no complete FederatedSignOut method in FAM // When using native FederatedSignOut() no events for signout will be called, if you need this use the FAM SignOut methods instead. }

Este código se usa en una biblioteca de RP estándar que creamos para SSO web con ACS.