Как стать поставщиком услуг SAML
Моя компания в настоящее время разрабатывает веб-приложение на 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>
Итак, моя первая пара вопросов.
Какое значение идентификатора должно быть?
И почему я могу объявить себя эмитентом?
Поставщик удостоверений знает обо мне? Может быть, это тот Круг доверия
Я видел на OpenAM. И если он знает обо мне, как он узнает обо мне и что он должен знать?
Таким образом, после того как пользователь перенаправлен на эту страницу, он попадает на страницу, предоставленную IDP https://their.samlserver.com. Они аутентифицируются на этой странице, и IDP делает чудо, чтобы подтвердить аутентификацию и найти пользователя. После успешной аутентификации IDP отправляет обратно <samlp:Response>
определенный здесь.
Еще несколько вопросов.
Во-первых, как <samlp:Response>
возвращается в мое веб-приложение, чтобы я мог проверить его?
И что я должен искать в этом ответе, чтобы подтвердить, что он был успешным? Как выглядит сбой?
В настоящее время мы используем адрес электронной почты (LDAP) для идентификации пользователей, поэтому мы, вероятно, возьмем его из ответа и используем его так же, как сейчас. Что-нибудь еще, что я должен помнить в этом ответе?
Итак, теперь, когда мы проверили этот ответ на достоверность, мы можем предоставить пользователю сеанс, как мы делаем в настоящее время. Но когда они хотят выйти, есть ли рабочий процесс для этого? Нужно ли уведомлять IDP о том, что пользователь ушел?
И, наконец, есть несколько тем, которые обсуждались в моем чтении, и я не уверен, как они вписываются в этот рабочий процесс. Это Круг доверия, Жетоны и Артефакты.
Спасибо за любую помощь всем. Я нашел много информации за последние пару дней, и вполне возможно, что я смогу собрать их вместе, немного поиграв. Но мне еще предстоит найти простую статью "Здесь пост" еще. Может быть, потому что я не прав, как это работает. Может быть, потому что это не так популярно. Но я действительно хотел убедиться, что у меня есть рабочий процесс, чтобы я не пропустил важный шаг в такой важной вещи, как аутентификация пользователя.
Ответы
Ответ 1
В ответ на ваши конкретные вопросы:
1.) Каким должно быть значение "ID"?
- Это должен быть уникальный идентификатор для запроса SAML. Спецификация SAML 2.0 заявляет, что это действительно зависит от реализации, но дает следующие рекомендации:
Механизм, посредством которого системный объект SAML обеспечивает уникальность идентификатора, оставлен для реализации. В случае, если используется случайный или псевдослучайный метод, вероятность того, что два случайно выбранных идентификатора будут идентичными, ДОЛЖНА быть меньше или равна 2 ^ -128 и ДОЛЖНА быть меньше или равна 2 ^ -160 по длине. Это требование МОЖЕТ быть удовлетворено путем кодирования произвольно выбранного значения длиной от 128 до 160 бит.
2.) Как IdP узнает о вас?
- Ваш SP должен быть зарегистрирован в 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
Если вы просто пытаетесь установить одно приложение Java в качестве поставщика услуг, вам следует рассмотреть возможность использования Fedlet из Oracle (как автономный) или ForgeRock (в комплекте с OpenAM). В Fedora Fedora есть некоторые проблемы, связанные с Shibboleth 2.2.1 как поставщик удостоверений, но я считаю, что это несколько проще для настройки и более информативного.
У каждого есть явные инструкции, содержащиеся в README, чтобы помочь вам развернуть. После того, как Fedlet настроен и взаимодействует с IDP, страница успеха показывает вам весь код, необходимый для интеграции интегрированного SSO в ваше приложение. Он выполняет фоновую работу по отправке и получению AuthnRequests и ответов.
Ответ Скотта довольно хорошо отвечает на ваши вопросы, но я думаю, что попытка написать собственный код, который генерирует SAML, - это изобретать колесо. Fedlet был разработан с учетом именно этого использования.