我正在使用以下过滤器在我的Web应用程序中启用NTLM身份验证。
我得到Windows浏览器身份验证提示。运行正常。除了以下事实外- 我无法确定身份验证是成功还是失败! * 两种情况均无错误。
*在每种情况下都将打印用户名(正确或相反),工作站等。
package com.test;
import java.io.IOException;
import java.io.PrintStream;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jcifs.ntlmssp.Type3Message;
import com.sun.xml.internal.ws.util.StringUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class NTLMUserFilter implements Filter {
private FilterConfig filterConfig = null;
private String userDomain = null;
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
String username = null;
//first, get the user agent
String useragent = request.getHeader("user-agent");
//if you're using IE, you can continue
if ((useragent.indexOf("MSIE") > -1)){
//Always do the ntlm check (for IE POST back)
try{
String auth = request.getHeader("Authorization");
if (auth == null)
{
response.setHeader("WWW-Authenticate", "NTLM");
response.setStatus(response.SC_UNAUTHORIZED);
response.setContentLength(0) ;
response.flushBuffer();
return;
}
if (auth.startsWith("NTLM "))
{
byte[] msg = new sun.misc.BASE64Decoder().decodeBuffer(auth.substring(5));
int off = 0, length, offset;
if (msg[8] == 1)
{
byte z = 0;
byte[] msg1 = {(byte)'N', (byte)'T', (byte)'L', (byte)'M', (byte)'S', (byte)'S', (byte)'P', z,(byte)2, z, z, z, z, z, z, z,(byte)40, z, z, z, (byte)1, (byte)130, z, z,z, (byte)2, (byte)2, (byte)2, z, z, z, z, z, z, z, z, z, z, z, z};
response.setHeader("WWW-Authenticate", "NTLM " + new sun.misc.BASE64Encoder().encodeBuffer(msg1));
response.setStatus(response.SC_UNAUTHORIZED);
response.setContentLength(0) ;
response.flushBuffer();
return;
}
else if (msg[8] == 3)
{
//Did Authentication Succeed? All this is always printed.
Type3Message type3 = new Type3Message(msg);
System.out.println("osUser: " + type3.getUser());
System.out.println("osRemoteHost: + " + type3.getWorkstation());
System.out.println("osDomain: " + type3.getDomain());
}
}
}catch(Exception e){
System.out.println(e) ;
}
//System.out.println("Suc);
}
try {
chain.doFilter(req, res);
} catch (IOException e) {
System.out.println(e);
} catch (ServletException e) {
System.out.println(e);
}
}
public void destroy()
{
this.filterConfig = null;
}
}
web.xml很简单:
<filter>
<filter-name>ntlmFilter</filter-name>
<filter-class>
com.test.NTLMUserFilter
</filter-class>
</filter>
<!-- Filter mapping configuration -->
<filter-mapping>
<filter-name>ntlmFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
您收到的是Type 3消息,但是除了打印出详细信息之外,您什么都没做。此时,您需要验证客户的响应,并发送200(如果已授权)或401(如果未授权)。
但是,您传递的Type
1消息是由静态字节组成的,尽管它会诱使客户端发送回响应,但大多数情况下是毫无意义的。自己实现一个完整的NTLM身份验证堆栈不是不可能的,但是您拥有的代码将根本无法工作。
您可以研究Java的NTLM解决方案,或者(假设您使用的是Windows)可以调用必要的身份验证功能,例如AcceptSecurityContext
JNI。
问题内容: 我想在我的Java应用程序中使用Windows NTLM认证来透明地认证Intranet用户。如果使用浏览器(单点登录),用户将不会注意到任何身份验证。 我发现了一些具有NTLM支持的库,但是不知道要使用哪个库: http://spnego.sourceforge.net/ http://sourceforge.net/projects/ntlmv2auth/ http://jcifs
问题内容: 我们的团队构建了一个WebLogic Intranet网站。用户当前必须输入其Active Directory登录名/密码才能访问该站点。 由于我们的大多数用户已经登录到域,因此我们想使用集成Windows身份验证,因此用户不必重新输入其登录密码。 我已经使用Windows / IIS上托管的.NET应用程序完成了此操作。但是,此应用程序内置于WebLogic / Java中,并托管在
问题内容: Golang网络抓取工具需要从经过NTLM认证的网页中提取信息。 拥有有效的用户名和密码后,网络抓取工具如何与服务器执行NTLM 4向握手,以获取对后面受保护网页的访问权限? 问题答案: 您可以在开始抓取之前使用类似身份验证的包。
我需要在我们的Web应用程序中使用LDAP/AD服务器实现SSO身份验证和验证用户。Web应用程序是使用Spring(Java)/Hibernate制作的,应用程序服务器是UAT中的Jboss和生产中的Webphere。 我正在寻找一些好的简单的解决方案,可以帮助我实现它,从几个朋友那里听说华夫饼是一个很好的解决方案,但是在网上搜索并尝试了几天之后,我不确定我是否朝着正确的方向前进。我在这方面很幼
问题内容: 尝试使用JavaMail中的NTLM连接到Exchange服务器。我可以连接到SMTP,但不能连接到IMAP。我还可以使用相同的主机/用户名/密码通过OS X Mail.app应用程序进行身份验证,帐户类型=“ IMAP”,端口143,ssl = false,authentication = NTLM,域名=“。 连接代码: 输出: 我尝试通过http://www.oracle.com
问题内容: 我正在使用Spring 3 Web应用程序,因为Spring 3不支持NTLM身份验证,可以与Spring安全性一起使用的其他替代方法有哪些?这样,当用户登录到Active Directory时就可以通过应用程序进行身份验证了吗? 目前,Kerberos解决方案不是一个选择,NTLM是唯一的选择。 任何帮助都是非常明显的。 谢谢 问题答案: 我已经做过一次了。在这里抓住它。它将需要在A