แอปพลิเคชันไคลเอนต์เดสก์ท็อปสำหรับ SSO โดยใช้ SAML

ฉันจำเป็นต้องเขียนแอปพลิเคชันไคลเอนต์บนเดสก์ท็อปซึ่งทำการเรียกเมธอดบริการเว็บบางอย่างไปยังเซิร์ฟเวอร์ SharePoint หลังจากทำการตรวจสอบสิทธิ์ SSO ที่ใช้ SAML

ฉันพบว่า SAML SSO ส่วนใหญ่จะใช้จากเบราว์เซอร์ที่ดูแลรายละเอียดทั้งหมด ตามคำถามนี้ ดูเหมือนว่ามีเทคโนโลยีใน SAML 2.0 ที่เรียกว่า ECP เพียงเพื่อเปิดใช้งานไคลเอนต์ที่ไม่ใช่เบราว์เซอร์

แต่แอปพลิเคชันบางตัวเช่น SharePoint 2010/2013 รองรับ SAML 1.1 เท่านั้น ในกรณีนี้สามารถใช้อะไรได้บ้าง?


person aroy    schedule 13.01.2015    source แหล่งที่มา
comment
โดยพื้นฐานแล้ว SAML ไม่ต้องการให้ลูกค้าเป็นเบราว์เซอร์ โดยพื้นฐานแล้วเบราว์เซอร์ที่นี่เป็นเพียงไคลเอนต์ที่รู้วิธีติดตามการเปลี่ยนเส้นทาง ดังนั้นไคลเอนต์ที่มีรายละเอียดเพียงพอจึงสามารถทำได้ ปีศาจยังคงอยู่ในรายละเอียดโดยเฉพาะอย่างยิ่งหากการเปลี่ยนเส้นทาง HTTP POST เกี่ยวข้องกับการพิสูจน์ตัวตน SAML (ซึ่งจะเป็นกรณีนี้อย่างแน่นอน) รายละเอียดเพิ่มเติมอาจขึ้นอยู่กับเทคโนโลยีเฉพาะที่คุณใช้   -  person SergGr    schedule 19.05.2017
comment
คุณไม่ได้กล่าวถึงข้อจำกัดด้านเทคโนโลยีใดๆ บางที Electron อาจช่วยได้: มันเป็นเฟรมเวิร์กที่ ไม่ใช่ไม่ใช่เบราว์เซอร์ (☺) สำหรับการสร้างแอปพลิเคชันเดสก์ท็อป... มันจะจัดการคุกกี้และติดตามการเปลี่ยนเส้นทางได้ดี   -  person Hugues M.    schedule 23.05.2017


คำตอบ (1)


คุณไม่ได้พูดถึงเทคโนโลยี ฉันสามารถแบ่งปันประสบการณ์ของฉันได้ เราจำเป็นต้องมี SSO ในแอปพลิเคชันเดสก์ท็อป (WPF) ที่ใช้บริการ WCF ฉันได้เริ่มต้นด้วยข้อมูลจาก ลิงก์ วิธีแก้ไขคือใช้ WIF เพื่อดึงโทเค็น SAML จากผู้ให้บริการข้อมูลระบุตัวตน และใช้เพื่อสร้างการเชื่อมต่อกับเซิร์ฟเวอร์แบ็กเอนด์ของเรา

  1. เพื่อรับโทเค็น

    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. จากนั้นโทเค็นที่ได้รับจะใช้ในการเรียกใช้บริการ:

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

แนวทางหลักจาก ลิงก์ไม่มีการเปลี่ยนแปลงจริงๆ - เราเพิ่งเพิ่มการแคชโทเค็นและรวมโค้ดนี้ไว้ในเฟรมเวิร์กการจัดการช่องของเรา รหัสนี้ใช้เพื่อตรวจสอบสิทธิ์ไคลเอ็นต์เดสก์ท็อปกับเซิร์ฟเวอร์ ADFS และใช้การอ้างสิทธิ์ในเซิร์ฟเวอร์แบ็กเอนด์ของเราเพื่อขออนุมัติ

person Roman Ananyev    schedule 25.05.2017