集成Windows身份验证

集成Windows身份验证(IWA)包括NTLM和Kerberos两种验证方式。NTLM依赖Windows凭据,需要多次交换且易受代理限制;Kerberos更安全,使用时间戳防止重播攻击,适用于Intranet环境,但通常需要Active Directory。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集成Windows身份验证 (Integrated Windows Authentication,IWA) 包含两种独立的身份验证机制。第一种是NTLM(NT LAN Manager),即Windows NT挑战/响应验证认证(Windows NT Challenge/Response authenticationis),第二种是Kerberos身份验证。

 NTLM使用Windows凭据(而不是未编码的用户名和密码)来转换质询数据。NTLM身份验证需要客户端和服务器之间的多次交换,要求启用HTTP keep-alive功能,否则将无法进行验证,即服务器和所有参与代理都必须支持持久连接,才能成功完成身份验证,因此无法通过大多数代理服务器发挥作用(因为许多代理服务器不允许keep-alive功能)。

NTLM工作流程是这样的:

1.     客户端首先在本地加密当前用户的密码成为密码散列。

2.     客户端向服务器发送自己的帐号,这个帐号是没有经过加密的,明文直接传输。

3.     服务器产生一个16位的随机数字发送给客户端,作为一个challenge(挑战)。

4.  &nbs

### 集成Windows身份验证于Java应用程序 对于希望在其Java应用中集成Windows身份验证的企业而言,通常会采用几种不同的方法来实现这一目标。一种常见的做法是通过使用特定的技术栈组件和服务来完成此操作。 #### 使用Integrated Windows Authentication (IWA) 为了使Java应用程序能够利用内置的Windows认证机制,可以考虑部署支持Kerberos协议的服务端环境,并确保客户端也相应配置以启用自动登录功能[^1]。这涉及到几个方面的工作: - **服务器端设置**:安装并配置Apache HTTP Server作为反向代理,在其上激活mod_auth_kerb模块用于处理来自浏览器请求中的票据授予票证(TGT),进而获取用户的SID信息。 - **JVM参数调整**:针对运行着Web容器(Jetty/Tomcat等) 的虚拟机实例,需指定必要的启动选项以便正确加载GSS-API库文件以及指明krb5.conf位置。 - **应用程序编码变更**:编写自定义过滤器或拦截器捕获HTTP头字段内的Negotiate Token数据流;随后调用SPNEGO API解析该令牌从而得到最终的身份标识符。 ```java import javax.security.auth.Subject; import javax.security.auth.login.LoginContext; import javax.security.auth.login.LoginException; public class KerberosAuthenticator { public static Subject authenticate(String principalName, String keytabPath) throws LoginException { System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); final String jaasConf = "com.sun.security.jgss.initiate {\n" + " com.sun.security.auth.module.Krb5LoginModule required\n" + " useKeyTab=true\n" + " storeKey=true\n" + " doNotPrompt=true\n" + " debug=false\n" + " renewTGT=true\n" + " serviceName=\"HTTP\"\n" + " principal=\"" + principalName + "\"\n" + " keyTab=\"" + keytabPath +"\";\n" + "};"; java.io.File confFile = new java.io.File("/tmp/jaas.conf"); try(java.io.FileWriter writer = new java.io.FileWriter(confFile)){ writer.write(jaasConf); } System.setProperty("java.security.krb5.conf","/etc/krb5.conf"); LoginContext lc = new LoginContext("com.sun.security.jgss.initiate", null, null, new java.util.HashMap<String,String>(){{ put("java.security.auth.login.config",confFile.getAbsolutePath()); }}); lc.login(); return lc.getSubject(); } } ``` 上述代码片段展示了如何创建一个简单的类`KerberosAuthenticator`, 它负责执行基于Kerberos的身份验证流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值