论坛首页 Java企业应用论坛

Java Web应用集成域用户登陆问题

浏览 15725 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2009-07-23   最后修改:2009-07-23
最近在项目中遇到Java Web应用需要集成域用户登陆问题,
初看很简单,分析一下要解决的问题还是很多的,特拿出来讨论,听听大家的思路
不知道是否有成熟的方案可以直接借鉴,最好是开源社区的东西。

补充业务需求:
已经通过域帐号登陆的用户在登陆Web应用时不需要验证直接进入系统,否则提示输入用户名和密码

我现在从以下几个问题考虑
问题1:
客户端如何获取域用户信息?
AtiveX, applet, js, flash都可以拿到当前登陆的用户,好像密码拿不到

问题2:
服务器用户如何验证?
LDAP验证是一种方式,或者Jaas的NTLoginModule,还未测试过

问题3:
用户信息如何同步
只需要单向同步,从域服务器同步过来,如果发现有新的登陆名则在系统中建立新用户

问题4:
如果应用服务器在外网而域控制器有什么解决方案?
(这种方案中客户端和域控制服务器必然在一个子网中)



   发表时间:2009-07-23  
问题1找到NTLM做身份验证,但只IE支持,还未做测试
问题2找到开源产品JCIFS做单点登陆,计划移植到cas中去
0 请登录后投票
   发表时间:2009-07-24  
找到一个IE only的方案,用Javascript在本地判断是否为登陆域的用户以及是否特定域服务器,是则直接用该用户进入系统
0 请登录后投票
   发表时间:2009-07-25   最后修改:2009-07-31
通过IE可以实现功能,但是遇到activex的权限问题,还得另外找路

0 请登录后投票
   发表时间:2009-07-27  
		try {
			UniAddress dc = UniAddress.getByName(DomainIP2);
			jcifs.smb.NtlmPasswordAuthentication auth = new jcifs.smb.NtlmPasswordAuthentication(
					DomainIP2, userId, password);
			// jcifs.smb.SmbSession.getChallengeForDomain().
			jcifs.smb.SmbSession.logon(dc, auth);

		} catch (jcifs.smb.SmbAuthException e) {
			url = "domainlogin.jsp";
			msg = e.toString();
			// request.setAttribute("errMsg", "密码或用户名错误");
			// request.getRequestDispatcher(url).forward(request, response);
			// json="{result:0}";
			return 0;

		} catch (jcifs.smb.SmbException e) {
			// ip2 无法访问, 转 ip1
 ...
 }


0 请登录后投票
   发表时间:2009-07-27  
谢谢xieke的帮助,jcifs实现了服务器端通过Java来调用NTDomain验证

“已经通过域帐号登陆的用户在登陆Web应用时不需要验证直接进入系统,否则提示输入用户名和密码”,可以解决输入用户名和密码后通过NTDomain验证,但是如何让已经登陆的用户不用输入用户名和密码就完成验证呢?
0 请登录后投票
   发表时间:2009-07-27  
考虑比较理想的方案

本地ntml(如kerboros方式)认证通过将认证结果传给服务器,这样避免无法拿到密码以及应用服务器可能无法访问局域网内的域控制服务器等问题
0 请登录后投票
   发表时间:2009-07-27   最后修改:2009-07-27
谢谢prosong提供帮助找到Java验证NTLM的代码
String auth = request.getHeader("Authorization");
if (auth == null)
{
  response.setStatus(response.SC_UNAUTHORIZED);
  response.setHeader("WWW-Authenticate", "NTLM");
  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.sendError(response.SC_UNAUTHORIZED);
    return;
  }
  else if (msg[8] == 3)
  {
    off = 30;

    length = msg[off+17]*256 + msg[off+16];
    offset = msg[off+19]*256 + msg[off+18];
    String remoteHost = new String(msg, offset, length);

    length = msg[off+1]*256 + msg[off];
    offset = msg[off+3]*256 + msg[off+2];
    String domain = new String(msg, offset, length);

    length = msg[off+9]*256 + msg[off+8];
    offset = msg[off+11]*256 + msg[off+10];
    String username = new String(msg, offset, length);

    out.println("Username:"+username+"<BR>");
    out.println("RemoteHost:"+remoteHost+"<BR>");
    out.println("Domain:"+domain+"<BR>");
  }
}
0 请登录后投票
   发表时间:2009-07-28  
不明白的是,lz的应用不是sso擅长的么?
1 请登录后投票
   发表时间:2009-07-30  
传说有个东西叫sso
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics