2015-01-13 5 views
9

Ich muss eine Desktop-basierte Client-Anwendung schreiben, die einige Web-Service-Methodenaufrufe zu einem SharePoint-Server ausführt, nachdem eine SAML-basierte SSO-Authentifizierung.Desktop-Client-Anwendung für SSO mit SAML

Ich fand, dass SAML SSO meistens vom Browser verwendet wird, der sich um alle Details kümmert. Laut this question scheint es in SAML 2.0 eine Technologie namens ECP zu geben, nur um nicht browserbasierte Clients zu aktivieren.

Noch einige Anwendungen wie SharePoint 2010/2013 unterstützen nur SAML 1.1; Was kann in diesem Fall verwendet werden?

+1

Grundsätzlich benötigt SAML keinen Client als Browser. Im Wesentlichen "Browser" ist hier nur ein Client, der Redirects zu folgen versteht, so dass es von jedem ausreichend ausgearbeiteten Client durchgeführt werden kann. Dennoch steckt der Teufel im Detail, insbesondere wenn HTTP POST Redirect in die SAML-Authentifizierung involviert ist (was sicherlich der Fall sein wird). Weitere Details können von der jeweiligen Technologie abhängen, die Sie verwenden. – SergGr

+0

Sie haben keine Beschränkung der Technologie erwähnt. Vielleicht [Electron] (https://electron.atom.io/) könnte helfen: Es ist ein nicht-non-browser_ (☺) Framework für die Erstellung von Desktop-Anwendungen ... Es wird Cookies und folgen Redirects nur gut. –

Antwort

1

Sie haben keine Technologie erwähnt - ich kann meine Erfahrung teilen. Wir benötigen eine SSO in der Desktopanwendung (WPF), die die WCF-Dienste verwendet. Ich habe mit Infomation von dieser link angefangen. Die Lösung besteht darin, WIF zu verwenden, um das SAML-Token vom Identity-Provider abzurufen und damit die Verbindung zu unserem Backend-Server herzustellen.

  1. zu erhalten, das 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. Dann wurde die erhaltene Token in Dienst verwendet wird nennt:

    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 {...} 
    

Der Hauptansatz der link nicht wirklich war geändert - wir haben gerade Token-Caching hinzugefügt und diesen Code in unser Channel-Handling-Framework integriert. Der Code wird verwendet, um den Desktop-Client gegen den ADFS-Server zu authentifizieren und Ansprüche auf unserem Backend-Server für Autorisierungen zu verwenden.