UsernameToken 身份验证
现在我们来讨论身份验证问题并且讨论一个最简单的方案:UsernameToken身份验证。
UsernameToken 身份验证
UsernameToken
身份验证与HTTP身份验证很相似,此时用户保密信息在消息的头部被传送。UsernameToken被添加到SOAP的头部,可能还会夹杂着一个散列的口令。这是一种加密的简单形式,可以避免无限制地传递口令。应该使用传输级别或者消息级别的加密来保证用户口令的保密性。
通过允许配置一个用于口令验证的LDAP,应用程序服务器支持UsernameToken身份验证。在应用程序服务器收到一个SOAP消息时,在将消息转发给应用程序之前,它会通过LDAP验证用户证书的正确性。
由于其简易性和在应用程序服务器中的广泛支持,UsernameToken身份验证是非常吸引人的。然而,在考虑将它部署到你的应用框架时,你必须清楚其限制条件:
会话状态:
UsernameToken需要用户名和口令在每一个Web服务的调用上都被传递。这暗示着如果客户端经常与该服务会话,客户端必须要对口令进行缓存,而这会导致一种安全风险。
性能:应用程序服务器必须重新验证每一个Web服务调用。而且,因为口令是消息的一部分,那么即使消息并没有包含敏感信息也必须加密。
为了演示UsernameToken身份验证,下面的例子重新使用了计算器服务的例子。你必须配置应用程序服务器以支持UsernameToken的安全,并且指定一个LDAP来验证用户的证书。配置步骤是与特定服务器相关的,因此请参考你的服务器的相关文档。笔者用WebSphere
6.1和活动目录测试了这个例子。
你必须增加一个WSS4J
SOAP处理程序,以支持客户端支持在报头中发送UsernameToken。下面的客户端代码在调用Web服务之前,先调用configureClientHandlers方法:
public static void main(String[] args) throws MalformedURLException {
CalculatorServiceClient sc = new CalculatorServiceClient();
Calculator calc = sc.getCalculator(UT_ENDPOINT);
configureClientHandlers(calc);
float a = 5f;
float b = 7f;
System.out.println(a + " * " + b + " = " + calc.multiply(a,b));
} |
configureClientHandlers方法创建一个新的拥有UsernameToken
属性的WSS4JoutHandler处理程序。下面的configureUsernameToken方法指定了属性:
private static void configureClientHandlers(Object svc) {
Client client=Client.getInstance(svc);
client.addOutHandler(new DOMOutHandler());
Properties properties = new Properties();
// Configure the UsernameToken properties
configureUsernameToken(properties);
client.addOutHandler(new WSS4JOutHandler(properties));
}
protected static void configureUsernameToken(Properties config)
{
// UsernameToken Action
config.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
// Clear Text Password
config.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
// User name to send
config.setProperty(WSHandlerConstants.USER, "johndoe");
// Callback used to retrieve password for given user.
config.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS,
PasswordHandler.class.getName());
} |
(下一页)
网友评论