2016-07-05 6 views
4

У нас есть продукт с одним клиентом, и мы реализовали поток SAML для этого клиента с использованием Spring Security SAML, когда мы выступаем в качестве поставщика услуг, а idp - на стороне клиента.Spring SAML - поддержка индивидуального утверждения SAML

Теперь у нас есть еще один клиент, который также хочет, чтобы аутентификация была с SAML, и мы хотим, чтобы тот же SP реализовал поток SAML для этого клиента, а второй клиент будет иметь 2 потока для SAML для мобильного устройства, а другой для другие устройства, использующие тот же IDP. IDP двух клиентов отличаются друг от друга.

Проблемы

Есть некоторые различия между этими двумя клиентами, например, атрибуты утверждения таких разными, и действие аутентификации успеха разное, в настоящее время мы обеспечиваем собственную реализацию.

Также может быть больше изменений, как различные переплетов и т.д. ...

Мой вопрос: что является лучшим/лучшей практики вариант поддержки такого сценария и, чтобы иметь возможность расширить свой SP для поддержки более SAML потоков с различия в атрибутах Assertion и других конфигурациях?

Когда мы используем Spring SAML, мы должны использовать различные контекстные файлы Spring Security для каждого из ароматов SAML?

Существуют ли проблемы с безопасностью потоков при параллельном использовании нескольких контекстов?

ответ

2

Мой вопрос: что является лучшей/лучшей практика вариант поддержки такого сценария и, чтобы иметь возможность расширить свой SP для поддержки более SAML потоков с различиями в атрибутах самоутверждения и более конфигурациях?

Чтобы разветвить определенные конфигурации, такие как атрибуты Assertion, вам нужно будет создать отдельных Поставщиков услуг. Другие конфигурации и службы могут использоваться совместно. Другие конфигурации должны использоваться совместно. Например, я использую единую пользовательскую реализацию SAMLUserDetailsService, которая вытаскивает уникальный EntityID из учетных данных и использует это для сопоставления атрибутов SAML по-разному для каждого IDP.

Когда мы используем Spring SAML, мы должны использовать различные файлы контекстной информации Spring Security для каждого из ароматов SAML? Существуют ли проблемы с безопасностью потоков при использовании нескольких контекстов в ?

Я не рекомендую использовать несколько контекстов безопасности отдельно. По моему опыту, в Spring SAML очень много настроек, и, скорее всего, вам придется дублировать тонну кода без необходимости, делая это таким образом.

Весной SAML существует концепция использования различных псевдонимов для разных поставщиков услуг. Я установил множество поставщиков услуг для многих ВПЛ и смог использовать один контекст Spring Security и реализовать пользовательские службы, где мне нужно справиться с различиями. У меня нет полного списка ваших требований, и могут быть некоторые, которые просто не могут быть выполнены в контексте одной весенней безопасности, но я бы подождал, чтобы убедиться в этом, прежде чем принимать этот маршрут.

Что конкретно должно быть разным между каждым ВПЛ?

Я ограничен в том, какой код мне разрешено публиковать, но я включил все, что могу.

  • Точка входа URL - Если у вас есть несколько ВПЛ с псевдонимом, установленной в вашей конфигурации точка входа URL по умолчанию будет

    "/saml/login/alias/" +productAlias+ "?idp=" + entityId;

    Если вы находитесь за балансировки нагрузки , вы можете настроить его для перезаписи любого URL-адреса, который вы хотите использовать для URL-адреса для клиента.

  • Привязки и утверждения - Они настроены в каждом файле metadata.xml Service Providers и могут быть разными для каждого клиента. Реальная проблема заключается в том, как вытащить атрибуты из аутентифицированного запроса SAML и получить его в удобной форме.

    Я не знаю, есть ли лучший способ сделать это, но мое требование состояло в том, чтобы любые привязки отображались и настраивались для любого IDP, который я сконфигурировал. Для этого я внедрил обычай SAMLUserDetailsService. От SAMLCredential, переданного службой, вы можете использовать credential.getRemoteEntityID(), чтобы вытащить отображение для клиента. Оттуда вам нужно проанализировать атрибуты из учетных данных.

Пример разбора SAML атрибутов для Microsoft и других ВПЛ

public class AttributeMapperImpl implements AttributeMapper { 

    @Override 
    public Map<String, List<String>> parseSamlStatements(List<AttributeStatement> attributeList) { 
     Map<String, List<String>> map = new HashMap<>(); 
     attributeList.stream().map((statement) -> parseSamlAttributes(statement.getAttributes())).forEach((list) -> { 
      map.putAll(list); 
     }); 
     return map; 
    } 

    @Override 
    public Map<String, List<String>> parseSamlAttributes(List<Attribute> attributes) { 
     Map<String, List<String>> map = new HashMap<>(); 
     attributes.stream().forEach((attribute) -> { 
      List<String> sList = parseXMLObject(attribute.getAttributeValues()); 
      map.put(attribute.getName(), sList); 
     }); 
     return map; 
    } 

    @Override 
    public List<String> parseXMLObject(List<XMLObject> objs) { 
     List<String> list = new ArrayList<>(); 

     objs.stream().forEach((obj) -> { 
      if(obj instanceof org.opensaml.xml.schema.impl.XSStringImpl){ 
       XSStringImpl xs = (XSStringImpl) obj; 
       list.add(xs.getValue()); 
      }else if(obj instanceof org.opensaml.xml.schema.impl.XSAnyImpl){ 
       XSAnyImpl xs = (XSAnyImpl) obj; 
       list.add(xs.getTextContent()); 
      } 
     }); 

     return list; 
    } 

    @Override 
    public String parseSamlStatementsToString(Map<String, List<String>> map) { 
     String values = ""; 
     Iterator it = map.entrySet().iterator(); 
     while (it.hasNext()) { 
      Map.Entry pair = (Map.Entry) it.next(); 
      values += pair.getKey() + "=" + pair.getValue() + " "; 
      it.remove(); // avoids a ConcurrentModificationException 
     } 
     return values; 
    } 

} 
  • действий на Success/Failure - Есть множество способов сделать это. Я решил использовать единую конечную точку в контроллере, который имеет доступ к сеансу, к которому все запросы идут успешно. После успешной проверки подлинности я могу вывести из сеанса, из какого IDP пользователь и перенаправить его соответственно. Сбой немного сложнее, потому что вполне возможно и, вероятно, что некоторые сбои будут настолько серьезными, что вы не будете знать, из какого IDP был получен запрос (т. Е. Если сообщение saml подписано с неправильным сертификатом).
+0

Различия между idps - это URL-адрес точки входа, привязки, действие с успехом и неудачей и утверждение ... можете ли вы поделиться образцом, который его демонстрирует? –

+0

Я добавил некоторую информацию в свой ответ – blur0224

Смежные вопросы