【问题标题】:desktop client application for SSO using SAML使用 SAML 的 SSO 桌面客户端应用程序
【发布时间】:2015-01-13 08:30:04
【问题描述】:

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

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

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

【问题讨论】:

  • 从根本上说,SAML 并不要求客户端是浏览器。本质上,这里的“浏览器”只是一个知道如何跟踪重定向的客户端,因此它可以由任何足够详细的客户端完成。细节仍然是魔鬼,特别是如果 HTTP POST 重定向涉及到 SAML 身份验证(肯定会是这种情况)。更多详细信息可能取决于您使用的特定技术。
  • 您没有提到对技术的任何限制。或许Electron 可以提供帮助:它是一个用于创建桌面应用程序的非非浏览器 (☺) 框架......它可以很好地处理 cookie 并遵循重定向。

标签: web-services sharepoint single-sign-on saml


【解决方案1】:

您没有提到技术 - 我可以分享我的经验。 我们需要在使用 WCF 服务的桌面应用程序 (WPF) 中具有 SSO。我从link 开始获取信息。解决方案是使用 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. 然后将获取到的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 的主要方法并没有真正改变 - 我们只是添加了令牌缓存并将此代码合并到我们的通道处理框架中。 该代码用于针对 ADFS 服务器对桌面客户端进行身份验证,并在我们的后端服务器中使用声明进行授权。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-19
    • 2013-03-13
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2011-06-10
    相关资源
    最近更新 更多