2013-02-18 3 views
3

J'utilise le service de contrôle d'accès Windows Azur avec STS personnalisé. Je peux me connecter à mon application via ACS, mais j'ai des problèmes avec la fonction de déconnexion. J'ai essayé ce code dans mon application. Mais il semble qu'il se déconnecte de l'utilisateur d'ACS mais pas du STS personnalisé. Que dois-je faire pour me déconnecter de STS. Où pourrait être le problème dans l'appliacation (RP), ACS ou dans STS?Déconnexion du service de contrôle d'accès avec STS personnalisé

Je pense que ACS devrait demander à STS personnalisé de se déconnecter de l'utilisateur, mais il semble qu'il ne le fasse pas. Qu'est-ce qui me manque?

Répondre

2

Le Décembre 2012 Mise à jour de l'ACS inclut le support pour la connexion à simple fédérée:

En utilisant le protocole WS-Federation. Les applications Web qui utilisent ACS à permettent l'authentification unique (SSO) avec les fournisseurs d'identité utilisant le protocole WS-Federation peuvent maintenant tirer parti des capacités de déconnexion unique . Lorsqu'un utilisateur se déconnecte d'une application Web, ACS peut signer automatiquement l'utilisateur hors du fournisseur d'identité et sur d'autres applications de confiance utilisant le même fournisseur d'identité.

Cette fonctionnalité est activée pour les fournisseurs d'identité WS-Federation, y compris Active Directory Federation Services 2.0 et Windows Live ID (compte Microsoft). Pour activer la connexion singulariser, ACS effectue les tâches suivantes pour le protocole WS-Federation points d'extrémité:

  • ACS reconnaît les messages de wsignoutcleanup1.0 des fournisseurs d'identité et répond en envoyant des messages à wsignoutcleanup1.0 partie utilisatrice applications.

  • ACS reconnaît wsignout1.0 et les messages Wreply de se fonder et applications partie répond en envoyant des messages à l'identité wsignout1.0 fournisseurs et messages wsignoutcleanup1.0 à partie utilisatrice applications.

De l'Code Sample: ASP.NET MVC 4 with Federated Sign-out, mettre en œuvre une action comme celui-ci pour vous déconnecter de l'ACS:

(Notez que Windows Identity Foundation est désormais intégrée dans le Cadre 4.5 .NET, c'est pourquoi les nouveaux espaces de noms ci-dessous)

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); 
} 
+0

Merci! J'ai cherché partout une solution comme celle-ci. Travaillé comme un charme. –

5

J'ai créé une méthode d'aide pour faire FederatedSignout, avec des commentaires dans le code pour ce que j'ai découvert le long du chemin (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. 
} 

Ce code est utilisé dans une bibliothèque RP standard que nous avons créée pour Web SSO avec ACS.

Questions connexes