用户在SOAP中进行身份validation – 如何操作?
我提出了一个关于JAX-WS,身份validation和授权的问题 – 如何? ; 讨论了安全级别以及存储用户凭据的位置。
现在得出一些结论后,我想尝试其中一种情况:
- SOAP Web服务 – metro
- 消息级安全性 – 相互证书身份validation,用于validation客户端应用程序
- 肥皂头中的用户凭证
如何获取凭据并进行授权? 我有两个想法:
- JAAS(我对此一无所知);
- SOAP处理程序 – 使用WebServiceContext从消息中提取凭据并“手动”执行授权。
你能帮我决定最好的方法,以及如何实现它?
请记住,我需要共同证书和用户令牌。
JAAS没有定义身份validation信息在SOAP中的外观,但WS-Security定义了在客户端 – 服务器交换期间可以使用的标准化令牌类型(用户名+密码令牌/ X.509证书/ SAML令牌/ Kerberos令牌)。
编辑:关于Metro WebService堆栈,您需要(从这里和这里采取的步骤):
- 注入处理程序,它通过
((BindingProvider)port).getBinding().setHandlerChain(Collections.singletonList(handler))
以编程方式实现javax.xml.ws.handler.soap.SOAPHandler
到JAX-WS处理程序链,或通过添加声明性地@HandlerChain(file = "handlers.xml")
对WS端点接口的注释。 - 处理程序应该使用
XWSSProcessorFactory
创建XWSSProcessor
实例,该实例传递实现javax.security.auth.callback.CallbackHandler
的回调处理程序。 - 回调处理程序例如在回调上定义validation器(取决于回调类型)。
这与“手工操作”相同(因为第一步是交叉SOAP消息),顶部有一些WSS糖。 但WSIT(和CXF)使用JAAS API,它们为各种身份validation令牌提供标准实现。 启用它们需要一些配置/编码工作,但好处是如果您以后决定从plainttext切换到Kerberos身份validation,则不需要编写很多代码。 此外,“手动执行”意味着您需要处理XML级别的身份validation信息,并且您要执行的是执行其中一个标准。
我建议使用基于WSS4J的 Apache CXF – Apache的WS-Security实现。 您可以轻松找到教程(例如此处和此处的用户名+密码, 此处和此处为SAML),以显示定义回调 /拦截器以validation身份validation信息。 CXF的优势在于它与Spring的良好集成。