Как стать поставщиком услуг SAML - PullRequest
78 голосов
/ 31 марта 2011

Всем доброе утро,

В настоящее время моя компания разрабатывает веб-приложение на Java.У нескольких наших клиентов есть внутренние серверы SAML (провайдеры идентификации?), И они попросили нас интегрироваться с ними.Так что недавно я читал об этом и играл с OpenAM.Примерно через 3 дня у меня появилось общее понимание, но в моих знаниях все еще есть пробелы.Я надеюсь, что кто-то может прояснить это для меня.

Итак, вот как я представляю рабочий процесс входа пользователя в систему.

Давайте определим сервер SAML наших клиентов как https://their.samlserver.com.Таким образом, пользователь приходит в наше веб-приложение для защищенного ресурса.Скажем, URL-адрес http://my.app.com/something.

Так что, если я прав, my.app.com - это то, что SAML определяет как Поставщик услуг .Наше приложение понимает, что этот пользователь должен войти в систему. Затем мы представляем пользователю страницу, подобную этой ...

<script>JQuery Script to auto submit this form on ready</script>
<form method="post" action="https://their.samlserver.com/Post/Servlet">
    <input type="hidden" name="SAMLRequest" value="someBase64Data" />
    <input type="submit" value="Submit" />
</form>

И эта someBase64Data должна быть base64 кодированной версией этого ...

<samlp:AuthnRequest
  xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
  ID="identifier_1"
  Version="2.0"
  IssueInstant="2004-12-05T09:21:59Z"
  AssertionConsumerServiceIndex="0">
 <saml:Issuer>http://my.app.com</saml:Issuer>
 <samlp:NameIDPolicy
   AllowCreate="true"
   Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
</samlp:AuthnRequest>

Итак, моя первая пара вопросов.

Каким будет значение ID ?

И почему я могу объявить себя эмитентом ?

Знает ли провайдер идентификации обо мне?Может быть, это то, что Круг доверия

Я видел на OpenAM .И если он узнает обо мне, как он узнает обо мне и что ему нужно знать?

Таким образом, после того как пользователь перенаправит эту страницу, он будет перенаправлен на страницу, предоставленную IDP https://their.samlserver.com. Они аутентифицируются на этой странице, и IDP делает чудо, чтобы подтвердить аутентификацию и найти пользователя.После успешной аутентификации IDP отправляет обратно <samlp:Response> определенный здесь .

Еще несколько вопросов.

Во-первых, как<samlp:Response> вернуться к моему веб-приложению, чтобы я мог проверить его?

И что я должен искать в этом ответе, чтобы подтвердить, что он был успешным?Как выглядит сбой?

В настоящее время мы используем адрес электронной почты (LDAP) для идентификации пользователей, поэтому мы, вероятно, возьмем его из ответа и используем его так же, как сейчас.Что еще я должен помнить в этом ответе?

Итак, теперь, когда мы проверили этот ответ на достоверность, мы можем предоставить пользователю сеанс, как мы делаем в настоящее время.Но когда они хотят выйти, есть ли для этого рабочий процесс?Нужно ли мне уведомлять IDP о том, что пользователь ушел?

И, наконец, есть пара тем, которые обсуждались в моем чтении, и я не уверен, как они вписываются в этот рабочий процесс.Это Круг доверия , Жетоны и Артефакты .

Спасибо за любую помощь всем.Я нашел много информации за последние пару дней, и, возможно, я смогу собрать их вместе, немного поиграв.Но мне еще предстоит найти простую статью «Вот и все».Может быть, это потому, что я не прав, как это работает.Может быть, это потому, что это не так популярно.Но я действительно хотел убедиться, что у меня есть рабочий процесс, чтобы я не пропустил важный шаг в такой важной вещи, как аутентификация пользователя.

Ответы [ 2 ]

45 голосов
/ 01 апреля 2011

В ответ на ваши конкретные вопросы:

1.) Каким должно быть значение "ID"?

  • Это должен быть уникальный идентификатор для запроса SAML. Спецификация SAML 2.0 заявляет, что это действительно зависит от реализации, но дает следующие рекомендации:

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

2.) Как IdP узнает о вас?

  • Ваш ИП должен быть зарегистрирован в IdP. Для этого спецификация SAML определяет формат для «Метаданных SAML», который сообщает IdP, где находятся ваши получатели SAML, каковы ваши сертификаты, какие атрибуты вы обмениваетесь и т. Д. OpenAM, вероятно, диктует некоторые минимальные требования для настройки доверенного SP. Это зависит от продукта.

3.) Куда идет Ответ, и что проверить?

  • Ответ отправляется на ваш URL-адрес службы поддержки пользователей (ACS), обычно определяемый в метаданных SAML, которыми вы обмениваетесь с вашим SP с IdP для начальной настройки. Когда вы получаете ответ SAML, вам нужно проверить много вещей, но самое главное, код состояния SAML должен быть «успешным», идентификаторы inResponseTo должны соответствовать отправленным запросам, и вы должны проверить цифровую подпись в утверждении. Для этого вам нужно довериться общедоступному сертификату проверки IdP, и, возможно, вы также захотите выполнить проверку отзыва.

4.) А как насчет выхода?

  • SAML 2.0 также определяет профиль для Single LogOut (SLO). Это приведет не только к выходу из SP, но также к IdP и, возможно, к любым другим SP, с которыми вы установили сеанс. Он имеет такой же поток запросов / ответов, что и Single Sign-On (SSO), и, таким образом, аналогичен настройке и проверке (коды состояния, подписи и т. Д.).

Короче говоря, это может быть довольно сложно реализовать с нуля. Лучше всего использовать проверенные и настоящие библиотеки и / или продукты, как предлагает Иан. Такие компании, как его, потратили сотни часов времени на разработку в соответствии со спецификацией и тестирование взаимодействия с другими поставщиками.

2 голосов
/ 18 апреля 2011

Если вы просто пытаетесь настроить одно приложение Java в качестве поставщика услуг, вам следует рассмотреть возможность использования Fedlet из Oracle (как автономный) или ForgeRock ( в комплекте с OpenAM). У ForgeRock Fedlet есть некоторые проблемы, связанные с Shibboleth 2.2.1 в качестве провайдера идентификации, но я считаю, что его настройка несколько проще и более информативна.

У каждого есть четкие инструкции, содержащиеся в README, чтобы помочь вам в развертывании. Как только Fedlet настроен и обменивается данными с IDP, на странице успеха показан весь код, необходимый для интеграции федеративного единого входа в ваше приложение. Он выполняет фоновую работу по отправке и получению AuthnRequests и Responses.

Ответ Скотта довольно хорошо отвечает на ваши вопросы, но я думаю, что попытка написать код самостоятельно, который генерирует SAML, - это заново изобретать колесо. Fedlet был разработан с учетом именно этого варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...