JAX-WS, аутентификация и авторизация - как? - PullRequest
11 голосов
/ 15 марта 2011

Как лучше всего выполнять аутентификацию и авторизацию в веб-сервисах?

Я занимаюсь разработкой набора веб-служб, требующих контроля доступа на основе ролей. Использование метро - SOAP, простой Java без EJB.

  • Я хочу аутентифицировать пользователя только один раз, используя имя пользователя и пароль, который будет сопоставлен с базой данных. В последующих звонках.
  • Я бы хотел использовать какое-то управление сессиями. Могут быть некоторые идентификатор сеанса, полученный клиентом при входе в систему, который будет представлен во всех вызовов.

Пока:

  • Чтение аутентификация с использованием базы данных - но мне нужна проверка на уровне приложения;
  • Чтение аутентификация приложения с помощью jax-ws - но я не хочу каждый раз выполнять механизм аутентификации;

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

EDIT:

У меня все еще есть вопросы:

  • Как узнать имя вызываемого веб-метода?
  • Какой токен мне следует использовать?
  • Как передать этот токен между вызовами?

РЕДАКТИРОВАТЬ 2

Из-за @ ag112 ответа:

Я использую Glassfish.

Я использую WS-Policy и WS-Security для шифрования и подписи сообщений. Использование взаимной аутентификации сертификата. Я хотел бы дополнить этот уровень безопасности сообщений между приложениями аутентификацией и авторизацией пользователей также на уровне сообщений.

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

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

Ответы [ 4 ]

4 голосов
/ 10 октября 2011

@ Луис: Вот мой вклад.

Точное решение вашей проблемы зависит от того, какого типа клиентов веб-службы вы ожидаете, имеете ли вы контроль над клиентской системой веб-службы, вашим сервером приложений и т. Д. ..... но при условии, что у вас нет никакого контролячерез клиента веб-службы, для вас это просто сообщение SOAP через транспорт HTTP, вот вероятное решение.

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

Конечно, решение на транспортном уровне намного проще и общепринятым стандартом в случае транспортного уровняэто HTTP.Для уровня сообщений можно использовать спецификации ws, такие как ws-security.Каждый ваш запрос к веб-сервису - это простой HTTP GET / POST, идентифицируемый уникальным HTTP URI.Обычно в среде метрополитена jax-w WSServlet - это тот, который вводит сервлет для любого вызова веб-службы и который в конечном итоге делегирует вызов соответствующему классу реализации поставщика услуг.Поскольку ваше приложение будет развернуто на веб-сервере, вы можете использовать все возможности сеанса и аутентификации, предоставляемые веб-контейнером J2ee.

Поскольку вы ищете контроль доступа на основе ролей, я бы использовал стандартный <web-resource-collection>в web.xml, чтобы указать, какую роль вы хотели бы иметь в случае конкретного HTTP URI.Вы можете использовать стандартный модуль входа в систему JAAS, который может выполнять аутентификацию и заполнять субъект JAAS ролью.Если имя пользователя и пароль указаны в SOAP XML, модуль входа в систему JAAS также может искать / анализировать SOAP XML для получения этой информации.JAAS / сервер приложений автоматически создаст токен аутентификации и сохранит его как cookie, чтобы каждый последующий запрос не проходил процедуру аутентификации снова.Это все стандарт J2ee.Вы можете найти много помощи в Интернете по этому вопросу.Пожалуйста, дайте мне знать ваш сервер приложений, чтобы я мог предоставить вам дополнительную информацию.

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

РЕДАКТИРОВАТЬ1: Хорошо, основываясь на ваших дальнейших входных данных, вот мои дополнительные мысли: Безопасность сообщений, а именно шифрование и подпись, должна происходить, когда каждое сообщение перемещается между сервером и клиентом.где в качестве аутентификации сообщения - вы намереваетесь сделать один раз и передать клиенту токен сеанса / токена аутентификации для последующих вызовов.

Вопрос все еще остается: если вы добавите уникальный идентификатор сеанса в ответ SOAP при аутентификации в первый раз, выполнитевы ожидаете, что клиент проанализирует XML-ответ SOAP и гарантирует, что клиент будет отправлять вам идентификатор сеанса каждый раз в последующих запросах SOAP. ИЛИ Вы хотите, чтобы управление сеансом было прозрачным для клиента, и для клиента ему необходимо отправить токен имени пользователя / пароля в первый раз, а для последующих вызовов не требуется токен имени пользователя / пароля.В этом случае вам необходимо полагаться на управление сеансами на основе транспорта, например, для файлов cookie HTTP

. Теперь то, что лучше для вас, зависит от вашего варианта использования.Можете ли вы сказать мне, что ожидается поток сценариев использования?как другая система (клиент веб-службы) выполняет более одного вызова службы в вашей системе?Другой системный пользователь управляется / какой-то фоновый процесс?Что именно нужно, чтобы только первый вызов службы проходил через процесс аутентификации, а не последующие вызовы?

PS: сервер Glassfish предоставляет способ настройки провайдера аутентификации сообщений, который автоматически включает / отключает аутентификацию на уровне сообщений.

EDIT2: Я понимаю, что вы не хотите сохранять пользователяучетные данные в клиентском приложении и на сервере веб-службы нуждаются в этих учетных данных пользователя.OAuth - это открытый стандартный протокол, который позволяет сайту A получать доступ к личным данным пользователя на сайте B. Конечная идея заключается в том, что сайт A получает токен авторизации, который имеет конкретное время истечения.Таким образом, токен, содержащий зашифрованные учетные данные пользователя или идентификатор Jsession, поможет вам избежать необходимости повторной аутентификации. Вам нужно только решить, где вы хотите хранить токен на стороне клиентского приложения. Вы можете сохранить токен как cookie, если транспорт является HTTP-протоколом.

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

2 голосов
/ 14 октября 2011

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

Вопросы имеют 2 реквизита:

  • Безопасность на уровне сообщений;
  • Однократная аутентификация.

С помощью ag112 это трудно сделать или изящно каким-либо образом.Итак, вот выводы:

  • Для обеспечения безопасности на уровне сообщений каждый раз отправляйте учетные данные пользователя (поместите их в заголовок SOAP);
  • Для одноразовой аутентификации используйте защиту на транспортном уровне и выполнитеуправление сеансом.

Я предпочитаю первый, потому что уровень сообщений был самым большим требованием.

2 голосов
/ 13 сентября 2011

Вы также можете перейти на OpenEJB .

Он использовал JAAS с WS-Security.

Надеюсь, ссылка полезна.

0 голосов
/ 13 сентября 2011

Поскольку ответов не последовало, следуя совету @unhillbilly, я отвечаю на свой собственный вопрос, с указанием прогресса:

Как узнать имя вызываемого веб-метода;

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

Какой токен я должен использовать;

Я решилиспользуйте токен 128 бит, представляющий каждый сеанс.Веб-службы по-прежнему не работают в сеансе, ключ используется только для авторизации.

Как передать этот токен между вызовами.

Для веб-метода входа в системуУ результата есть токен, при каждом последующем вызове токен является параметром.есть лучший ответ?

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