Java教程是针对JDK 8编写的。本页中描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言更改。
有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息,请参阅JDK发布说明。
Digest-MD5认证是LDAP v3服务器所必需的认证机制( RFC 2829)。因为使用SASL是LDAP v3的一部分( RFC 2251),仅支持LDAP v2的服务器不支持Digest-MD5。
Digest-MD5机制在RFC 2831中有描述。它基于HTTP摘要认证( RFC 2251)。在Digest-MD5中,LDAP服务器发送包含各种认证选项的数据,它愿意支持加上一个特殊的令牌给LDAP客户端。客户端通过发送加密的响应来指示它选择的认证选项。响应被加密的方式能够证明客户端知道它的密码。然后LDAP服务器解密并验证客户端的响应。
要使用Digest-MD5认证机制,您必须设置以下认证环境属性。
下面的示例展示了客户端如何使用Digest-MD5对LDAP服务器进行身份验证。
// 设置用于创建初始上下文的环境 Hashtable<String, Object> env = new Hashtable<String, Object>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial"); // 使用C. User和密码"mysecret"进行身份验证 env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5"); env.put(Context.SECURITY_PRINCIPAL, "dn:cn=C. User, ou=NewHires, o=JNDITutorial"); env.put(Context.SECURITY_CREDENTIALS, "mysecret"); // 创建初始上下文 DirContext ctx = new InitialDirContext(env); // ... 使用ctx进行一些有用的操作
一个领域定义了身份验证实体(Context.SECURITY_PRINCIPAL属性的值)被选中的命名空间。一个服务器可能有多个领域。例如,一个大学的服务器可以配置为有两个领域,一个用于学生用户,另一个用于教师用户。领域配置由目录管理员完成。一些目录具有默认的单个领域。例如,Oracle Directory Server, v5.2使用机器的完全限定主机名作为默认领域。
在Digest-MD5身份验证中,您必须对一个特定的领域进行身份验证。您可以使用以下身份验证环境属性来指定领域。如果您没有指定领域,则将使用服务器提供的任何一个领域。
下面的示例展示了如何设置环境属性以使用Digest-MD5进行身份验证并指定域。为了使这个示例在您的环境中工作,您必须更改源代码,以使域值反映您在目录服务器上配置的内容。
// 在域“JNDITutorial”中以C. User和密码“mysecret”进行身份验证 env.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5"); env.put(Context.SECURITY_PRINCIPAL, "dn:cn=C. User, ou=NewHires, o=JNDITutorial"); env.put(Context.SECURITY_CREDENTIALS, "mysecret"); env.put("java.naming.security.sasl.realm", "JNDITutorial");
如果您需要使用隐私保护和其他SASL属性,请参考JNDI教程。