настольное клиентское приложение для 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: это небраузерный (☺) фреймворк. для создания настольных приложений ... он будет обрабатывать файлы cookie и хорошо выполнять перенаправления.   -  person Hugues M.    schedule 23.05.2017


Ответы (1)


Вы не упомянули технологии - могу поделиться своим опытом. Нам необходимо иметь единый вход в классическом приложении (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