在执行基于SAML的SSO身份验证之后,我需要编写一个基于桌面的客户端应用程序,该应用程序对SharePoint服务器进行一些Web服务方法调用。

我发现SAML SSO主要用于处理所有细节的浏览器。根据this question的说法,SAML 2.0中似乎有一种称为ECP的技术仅用于启用非基于浏览器的客户端。

然而,某些应用程序(如SharePoint 2010/2013)仅支持SAML 1.1;某些应用程序仅支持SAML 1.1。在这种情况下可以使用什么?

最佳答案

您没有提到技术-我可以分享我的经验。
我们要求在使用WCF服务的桌面应用程序(WPF)中有一个SSO。我已经从link的信息开始了。解决方案是使用WIF从身份提供者那里检索SAML token ,并使用它建立与后端服务器的连接。

  • 获取 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);
            }
        }
    }
    
  • 然后,将获得的 token 用于服务调用中:
    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 {...}
    

  • link的主要方法尚未真正更改-我们仅添加了 token 缓存,并将此代码合并到了我们的 channel 处理框架中。
    该代码用于根据ADFS服务器对桌面客户端进行身份验证,并将后端服务器中的声明用于授权。

    关于web-services - 使用SAML的SSO桌面客户端应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27917783/

    10-13 09:22