Идентификатор протокола запроса аутентификации Saml - PullRequest
11 голосов
/ 22 февраля 2011

При выполнении Http Redirect Binding с протоколом SAML2.0 я должен отправить в структуру Identity Provider, например:

<q1:AuthnRequest 
         ID="{82AB4AE6-919C-5FE6-C843-8342E6F9AB61}" Version="2.0" 
           IssueInstant="2011-02-22T09:19:48+0100" 
           Destination="https://test.server.com/Service.jsf" 
           IsPassive="false" 
           AssertionConsumerServiceURL="http://myservice.com/sso/" 
          xmlns:q1="urn:oasis:names:tc:SAML:2.0:protocol"> 
          <Issuer xmlns="urn:oasis:names:tc:SAML:2.0:assertion">test.server.com</Issuer>
</q1:AuthnRequest>

Мой вопрос: как генерируется значение ID?

ID="{82AB4AE6-919C-5FE6-C843-8342E6F9AB61}" Version="2.0"

Каковы правила его создания?

Ответы [ 5 ]

13 голосов
/ 22 апреля 2015

Точный метод генерации идентификаторов SAML явно не определен - он должен просто соответствовать стандартам идентификатора XML. XML-идентификатором является xsd: NCName, который получен из xsd: Name, который не может начинаться с числа или содержать пробелы и должен иметь 160 битов «случайности».

Простейший генератор идентификаторов в Java, который удовлетворяет этим критериям:

String id() {
  return "a" + UUID.randomUUID();
}

Кроме того, OpenSAML также поставляется с SecureRandomIdentifierGenerator:

// You will need to catch the NoSuchAlgorithmException during construction.
IdentifierGenerator idGenerator = new SecureRandomIdentifierGenerator();

String id() {
  return idGenerator.generateIdentifier();
}

Фактический код генерации выглядит так:

SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

String generateIdentifier() {
  return generateIdentifier(16);
}

String generateIdentifier(int size) {
  byte[] buf = new byte[size];
  random.nextBytes(buf);
  return "_".concat(new String(Hex.encode(buf)));
}

Еще одна альтернатива, извлеченная из SAMLSSOUtil :

char[] charMapping = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p' };
Random random = new Random();

String createID() {
  byte[] bytes = new byte[20]; // 160 bits
  random.nextBytes(bytes);

  char[] chars = new char[40];

  for (int i = 0; i < bytes.length; i++) {
    int left = (bytes[i] >> 4) & 0x0f;
    int right = bytes[i] & 0x0f;
    chars[i * 2] = charMapping[left];
    chars[i * 2 + 1] = charMapping[right];
  }

  return String.valueOf(chars);
}

Из Оазиса документов:

Простой тип xs: ID используется для объявления идентификаторов SAML для утверждений, запросов и ответов. Значения, объявленные как имеющие тип xs: ID в этой спецификации, ДОЛЖНЫ удовлетворять следующим свойствам в дополнение к свойствам, налагаемым определением самого типа xs: ID:

• Любая сторона, которая назначает идентификатор, ДОЛЖНА гарантировать, что существует незначительная вероятность того, что эта сторона или любая другая сторона случайно назначит один и тот же идентификатор другому объекту данных. • Если объект данных объявляет, что у него есть определенный идентификатор, ДОЛЖНА быть точно одна такая декларация.

Механизм, с помощью которого системный объект SAML обеспечивает уникальность идентификатора, оставлен для реализации. В случае, когда используется случайный или псевдослучайный метод, вероятность того, что два случайно выбранных идентификатора будут идентичными, ДОЛЖНА быть меньше или равна 2 ^ -128 и ДОЛЖНА быть меньше или равна 2 ^ -160. Это требование МОЖЕТ быть удовлетворено путем кодирования произвольно выбранного значения длиной от 128 до 160 бит. Кодировка должна соответствовать правилам, определяющим тип данных xs: ID. НЕОБХОДИМО, чтобы генератор псевдослучайных чисел был засеян уникальным материалом, чтобы обеспечить требуемые уникальные свойства между различными системами.

Простой тип xs: NCName используется в SAML для ссылки на идентификаторы типа xs: ID, поскольку xs: IDREF не может использоваться для этой цели. В SAML элемент, на который ссылается ссылка на идентификатор SAML, может фактически быть определен в документе, отдельном от того, в котором используется ссылка на идентификатор. Использование xs: IDREF нарушило бы требование, чтобы его значение совпадало со значением атрибута ID для некоторого элемента в том же документе XML.

2 голосов
/ 23 февраля 2011

Как вы генерируете это в основном зависит от вас. Единственное предостережение в том, что это должно быть допустимое значение типа XML ID (что означает, что оно не может начинаться с цифры или содержать пробелы). Вам нужно будет где-то сохранить его, чтобы сопоставить с ответом, который отправляет IdP.

2 голосов
/ 09 марта 2011

id - это xsd: NCName, полученное из xsd: Name, которое не может начинаться с числа

простейшего возможного идентификатора в Java:

String id = new UID().toString().replaceAll(":", "-");

и никогда не использовать его повторноid с любым другим AuthnRequest, в противном случае вы получите ошибку атаки воспроизведения, если IdP может обнаружить, что

1 голос
/ 22 февраля 2011

Раздел 1.3.4. «Справочные значения идентификатора и идентификатора» документа SAML 2.0 Core .

0 голосов
/ 04 ноября 2013

хорошо, это может быть поздно, но я думаю, что люди, ищущие ответ, могут получить выгоду ...

вы можете сослаться на SAMLUTIL , который имеет много стандартных утилитарных методов.Для создания идентификатора вы можете обратиться к методу createID () в этом утилите.

...