aplikasi klien desktop untuk SSO menggunakan SAML

Saya perlu menulis aplikasi klien berbasis desktop yang melakukan beberapa panggilan metode layanan web ke server SharePoint, setelah melakukan otentikasi SSO berbasis SAML.

Saya menemukan bahwa SAML SSO sebagian besar digunakan dari browser yang menangani semua detailnya. Menurut pertanyaan ini, sepertinya ada teknologi di SAML 2.0 yang disebut ECP hanya untuk mengaktifkan klien berbasis non browser.

Namun beberapa aplikasi seperti SharePoint 2010/2013 hanya mendukung SAML 1.1; apa yang bisa digunakan dalam kasus ini?


person aroy    schedule 13.01.2015    source sumber
comment
Pada dasarnya SAML tidak mengharuskan klien menjadi browser. Pada dasarnya browser di sini hanyalah klien yang mengetahui cara mengikuti pengalihan sehingga dapat dilakukan oleh klien mana pun yang cukup rumit. Masih ada masalah dalam detailnya, terutama jika pengalihan HTTP POST terlibat dalam autentikasi SAML (yang pasti akan terjadi). Detail lebih lanjut mungkin bergantung pada teknologi tertentu yang Anda gunakan.   -  person SergGr    schedule 19.05.2017
comment
Anda belum menyebutkan kendala apa pun pada teknologi. Mungkin Electron dapat membantu: ini adalah kerangka kerja non-non-browser (☺) untuk membuat aplikasi desktop... itu akan menangani cookie & mengikuti pengalihan dengan baik.   -  person Hugues M.    schedule 23.05.2017


Jawaban (1)


Anda belum menyebutkan teknologi - saya dapat berbagi pengalaman saya. Kita diharuskan memiliki SSO di aplikasi desktop (WPF) yang menggunakan layanan WCF. Saya sudah mulai dengan informasi dari tautan. Solusinya adalah menggunakan WIF untuk mengambil token SAML dari penyedia identitas dan menggunakannya untuk membuat koneksi ke server backend kami.

  1. Untuk mendapatkan tokennya

    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. Kemudian token yang diperoleh digunakan dalam panggilan layanan:

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

Pendekatan utama dari link belum benar-benar diubah - kami hanya menambahkan token caching dan memasukkan kode ini ke dalam kerangka penanganan saluran kami. Kode ini digunakan untuk mengautentikasi klien desktop terhadap server ADFS dan menggunakan klaim di server backend kami untuk otorisasi.

person Roman Ananyev    schedule 25.05.2017