2015-01-13 25 views
9

Ho bisogno di scrivere un'applicazione client basata su desktop che esegue alcune chiamate al metodo di servizio Web su un server SharePoint, dopo aver eseguito un'autenticazione SSO basata su SAML.applicazione client desktop per SSO che utilizza SAML

Ho scoperto che SAML SSO è utilizzato principalmente dal browser che si occupa di tutti i dettagli. Secondo this question, sembra che ci sia una tecnologia in SAML 2.0 chiamata ECP solo per abilitare client non basati su browser.

Tuttavia alcune applicazioni come SharePoint 2010/2013 supportano solo SAML 1.1; cosa può essere usato in questo caso?

+1

Fondamentalmente SAML non richiede che il client sia un browser. Essenzialmente "browser" qui è solo un client che sa come seguire i reindirizzamenti in modo che possa essere eseguito da qualsiasi client sufficientemente elaborato. Ancora il diavolo è nei dettagli, in particolare se il reindirizzamento HTTP POST è coinvolto nell'autenticazione SAML (che sarà sicuramente il caso). Ulteriori dettagli potrebbero dipendere dalla particolare tecnologia che utilizzi. – SergGr

+0

Non hai menzionato alcun vincolo sulla tecnologia. Forse [Electron] (https://electron.atom.io/) potrebbe aiutare: è un framework _non-non-browser_ (☺) per la creazione di applicazioni desktop ... gestirà i cookie e seguirà i reindirizzamenti semplicemente. –

risposta

1

Non hai menzionato la tecnologia - posso condividere la mia esperienza. È necessario disporre di un SSO nell'applicazione desktop (WPF) che utilizza i servizi WCF. Ho iniziato con le informazioni da questo link. La soluzione è utilizzare WIF per recuperare il token SAML dal provider di identità e utilizzarlo per stabilire la connessione al nostro server di back-end.

  1. Per ottenere il token

    WSTrustChannelFactory GetTrustFactory() 
    { 
        var binding = new WS2007HttpBinding(TrustChannelBindingConfiguration); 
        return new WSTrustChannelFactory(binding, StServiceUri); 
    } 
    
    SecurityToken GetTokenFromSts() 
    { 
        using (var trustFactory = GetTrustFactory()) 
        { 
         // here is the code to set trustFactory.Credentials 
         trustFactory.TrustVersion = TrustVersion.WSTrust13; 
         var rst = new RequestSecurityToken 
            { 
             RequestType = RequestTypes.Issue, 
             AppliesTo = new EndpointReference(YourServiceUri), 
             KeyType = KeyTypes.Bearer 
            }; 
    
         var channel = (WSTrustChannel) trustFactory.CreateChannel(); 
         try 
         { 
          return channel.Issue(rst); 
         } 
         catch (MessageSecurityException msex) 
         { 
          channel.Abort(); 
          throw new EMException(msex.InnerException.Message, msex); 
         } 
        } 
    } 
    
  2. Poi il token ottenuto viene utilizzato in servizio di chiamate:

    securityToken = GetToken(); 
    
        // 2. Create a channel with issued token to YourServiceInterface 
        // create binding and turn off sessions 
        var binding = new WS2007FederationHttpBinding(FederationBinding); 
    
        try 
        { 
         var factory = new ChannelFactory<YourServiceInterface>(binding, 
              new EndpointAddress(YourServiceUri)); 
    
         factory.Credentials.SupportInteractive = false; 
    
         var channel = factory.CreateChannelWithIssuedToken(securityToken); 
    
         // 3. Call YourMethod() on secured channel 
         return channel.YourMethod(); 
    } 
    catch {...} 
    

L'approccio principale dalla link non è stato davvero cambiato - abbiamo appena aggiunto il caching del token e incorporato questo codice nel nostro framework di gestione dei canali. Il codice viene utilizzato per autenticare il client desktop dal server ADFS e utilizzare le attestazioni nel nostro server di backend per le autorizzazioni.