Web services 使用SAML的SSO桌面客户端应用程序

Web services 使用SAML的SSO桌面客户端应用程序,web-services,sharepoint,single-sign-on,saml,Web Services,Sharepoint,Single Sign On,Saml,我需要编写一个基于桌面的客户端应用程序,在执行基于SAML的SSO身份验证后,该应用程序对SharePoint服务器执行一些web服务方法调用 我发现SAML SSO主要是从浏览器中使用的,浏览器负责所有细节。据介绍,SAML2.0中似乎有一种称为ECP的技术,仅用于启用非基于浏览器的客户端 然而,有些应用程序(如SharePoint 2010/2013)仅支持SAML 1.1;在这种情况下可以使用什么?您没有提到技术-我可以分享我的经验。 我们需要在使用WCF服务的桌面应用程序(WPF)中具有

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

我发现SAML SSO主要是从浏览器中使用的,浏览器负责所有细节。据介绍,SAML2.0中似乎有一种称为ECP的技术,仅用于启用非基于浏览器的客户端


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

您没有提到技术-我可以分享我的经验。 我们需要在使用WCF服务的桌面应用程序(WPF)中具有SSO。我从这篇文章的信息开始。解决方案是使用WIF从identity provider检索SAML令牌,并使用它建立到后端服务器的连接

  • 获取令牌

    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);
            }
        }
    }
    
  • 然后在服务调用中使用获得的令牌:

    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 {...}
    
    securityToken=GetToken();
    // 2. 使用颁发的令牌创建一个通道到您的ServiceInterface
    //创建绑定并关闭会话
    var binding=新的WS2007FederationHttpBinding(FederationBinding);
    尝试
    {
    var工厂=新渠道工厂(绑定,
    新端点地址(YourServiceUri));
    factory.Credentials.SupportInteractive=false;
    var channel=factory.CreateChannelWithIssuedToken(securityToken);
    //3.在安全通道上调用YourMethod()
    返回channel.YourMethod();
    }
    捕获{…}
    
  • 来自的主要方法没有真正改变-我们只是添加了令牌缓存,并将此代码合并到我们的通道处理框架中。
    该代码用于根据ADFS服务器对桌面客户端进行身份验证,并使用后端服务器中的声明进行授权。

    基本上,SAML不要求客户端是浏览器。本质上,这里的“浏览器”只是一个客户端,它知道如何跟踪重定向,因此任何经过充分阐述的客户端都可以执行重定向。但问题仍然在于细节,特别是如果在SAML身份验证中涉及HTTP POST重定向(这种情况肯定会发生)。更多细节可能取决于您使用的特定技术。您没有提到任何技术限制。也许会有帮助:它不是浏览器(☺) 用于创建桌面应用程序的框架…它可以很好地处理cookies和跟踪重定向。