JAX-WS,身份验证和授权 - 如何?

时间:2011-03-15 16:29:17

标签: java web-services authentication jax-ws access-control

在Web服务中进行身份验证和授权的最佳方法是什么?

我正在开发一组Web服务,需要基于角色的访问控制。 使用metro - SOAP,简单的java而不使用EJB。

  • 我想使用用户名和来验证用户一次 密码,与数据库匹配。在随后的电话中。
  • 我想使用某种会话管理。可能是一些 在登录时检索到客户端的会话ID将全部显示 呼叫。

到目前为止:

  • 阅读 authentication using a database - 但我想要应用程序级验证;
  • 阅读application authentication with jax-ws - 但我不想每次都进行身份验证机制;

  • 我想我可以使用SOAP Handler拦截所有消息,并使用消息附带的一些会话标识符令牌在hander中进行授权控制,可以与保存的标识符进行匹配在数据库中,在登录Web方法中。

修改

我还有一些问题:

  • 如何知道被调用的Web方法的名称?
  • 我应该使用什么样的代币?
  • 如何在通话之间传递此令牌?

编辑2

因为@ ag112回答:

我正在使用Glassfish。

我使用WS-Policy和WS-Security来加密和签名消息。使用相互证书身份验证。我想在应用程序之间补充此消息级别的安全性,同时在消息级别对用户进行身份验证和授权。

我只是在开发服务,我几乎不知道客户,只是他们可以用不同的语言创建。

此时我认为最重要的是做我需要做的事情来验证和验证用户,这是为客户端应用程序实现的最简单方法。

4 个答案:

答案 0 :(得分:4)

@Luis:这是我的输入。

您的问题的确切解决方案取决于您期望的Web服务客户端类型,您是否可以控制Web服务客户端系统,您的应用服务器等.....但假设您对Web服务没有任何控制权客户端,对于你来说它只是一个通过HTTP传输的SOAP消息,这里有可能的解决方案。

您当然可以执行会话管理&消息级别或传输级别的身份验证。这意味着您可以在SOAP消息中拥有会话令牌和身份验证令牌信息,也可以使用标准的HTTP会话和HTTP身份验证机制。

当然,如果传输层是HTTP,则传输级解决方案更简单且行业范围更广。对于消息级别,可以使用ws-security之类的ws规范。 您的每个Web服务请求都是由唯一HTTP URI标识的简单HTTP GET / POST。 通常在jax-ws metro环境中,WSServlet是用于任何Web服务调用的入口servlet,并最终将调用委托给正确的服务提供者实现类。由于您的应用程序将部署在Web服务器中,因此您可以利用J2ee Web容器提供的所有会话和身份验证工具。

由于您正在寻找基于角色的访问控制,我将在web.xml中使用标准<web-resource-collection>来指定在特定HTTP URI的情况下您希望拥有哪个角色。您可以使用标准JAAS登录模块,该模块可以进行身份​​验证并使用角色填充JAAS主题。如果在SOAP XML中提供用户名/密码,则JAAS登录模块还可以搜索/解析SOAP XML以检索这些信息。 JAAS / app服务器将自动创建身份验证令牌并将其存储为cookie,以便每个后续请求都不需要再次通过身份验证过程。这是所有J2ee标准。你可以在互联网上找到很多帮助。请让我知道您的应用服务器,以便我可以为您提供更多详细信息。

如果您仍想使用SOAP消息级会话管理,身份验证&amp;授权过程,然后为您提供更多详细信息,我可以了解有关您客户端的更多详细信息。

<强> EDIT1: 根据您的进一步投入,这是我的更多想法: 消息安全即加密和签名需要在服务器和客户端之间传递每个消息。在消息身份验证的情况下 - 您打算执行一次并向客户端提供会话令牌/身份验证令牌以进行后续调用。

问题仍然存在:如果在第一次身份验证的SOAP响应中放置一个唯一的会话标识符,您是否希望客户端解析SOAP响应XML并确保客户端每次在后续SOAP请求中都发送会话标识符。 您希望保持会话管理对客户端透明,对于客户端,它需要首次发送用户名/密码令牌,后续调用不需要任何用户名/密码令牌。在这种情况下,您需要依赖基于传输的会话管理,例如HTTP cookie

现在对你最好的取决于你的用例。你能告诉我预期的用例流程是什么吗?另一个系统(Web服务客户端)如何对您的系统进行多个服务调用?是另一个系统用户驱动/一些后台进程?您只希望第一次服务呼叫通过身份验证过程而不是后续呼叫的确切需求是什么?

PS:Glassfish服务器提供了一种配置消息身份验证提供程序的方法,该提供程序自动启用/禁用消息级别身份验证。

<强> EDIT2: 我知道您不希望在客户端应用程序中存储用户凭据,并且Web服务服务器需要这些用户凭据。 OAuth是开放标准协议,允许站点A访问站点B上的用户私有数据。最终的想法是站点A获取具有特定到期时间的身份验证令牌。因此,包含来自用户凭据或jsession id的加密的令牌可帮助您避免重新进行身份验证。 您只需要决定在客户端应用端保留令牌的位置 如果传输是HTTP协议,您可以将令牌保留为cookie。

说过每次传递用户凭据时,似乎更容易和直接。

答案 1 :(得分:2)

您也可以选择OpenEJB

它使用JAAS和WS-Security。

我希望这个链接很有用。

答案 2 :(得分:2)

在所有帮助之后,我创建了这个简化的答案,并总结了所讨论的所有想法。

这些问题有两个必要条件:

  • 消息级安全性;
  • 一次性身份验证。

使用ag112帮助,这很难做到,或以任何方式优雅。所以这里得出结论:

  • 对于消息级安全性,请发送给用户 每次凭证(将其放在SOAP标头中);
  • 一次性身份验证使用传输级别安全性,并执行 会话管理。

我更喜欢第一个,因为消息级别是最大的必需条件。

答案 3 :(得分:0)

由于没有答案,在@unhillbilly建议之后,我回答了我自己的问题,到目前为止取得了进展:

  

如何知道Web方法的名称   被召唤;

使用SOAP处理程序,找到正文中第一个元素的名称。

  

我应该使用什么样的代币;

我决定使用128位令牌,代表每个会话。 Webservices继续是无会话的,关键仅在于授权目的。

  

如何在通话之间传递此令牌。

对于登录Web方法,结果具有令牌,在每次后续调用中,令牌都是参数。

有更好的答案吗?