通过Kerberos认证与Active Directory通信

12

我正在开发一款Android应用程序,需要不同级别的身份验证,希望使用Active Directory进行身份验证。

据我所知,微软建议使用Kerberos。如何在Android上实现?我看到了javax.security.auth文档,但它并没有告诉我太多信息。

我还在某个地方看到过一个笔记,即Kerberos不包含用户组 - 这是真的吗?如果是这样,我是否需要同时使用LDAP来完成?

编辑

主要目标是实现与Active Directory的LDAP连接,以便对企业Android应用程序进行身份验证并赋予用户正确的权限。真正的障碍在于Google在其移植到Android时省略了许多Java Web Services API。(例如javax.naming)此外,Android jar中的许多连接机制似乎只包括作为传统代码,并且实际上什么也做不了。


1
你究竟想要实现什么?你是想从你的Android设备连接到一些外部服务器并使用Kerberos作为认证机制吗?还是你想使用用户的域凭据在本地登录用户?同时请注意,你需要在你的Android设备和域控制器之间建立一个开放的连接。这意味着,如果你想让你的身份验证方案通过网络运行,你必须向整个世界打开端口88以连接到你的域控制器。 - Vlad
我正在尝试对用户进行身份验证,并根据他们在Active Directory中的组成员身份,为他们提供访问Android应用程序特定部分的权限。我已经找到了一种方法,但是我还没有能够在Android应用程序上进行测试。 - Cody
4个回答

3

我发现这里的文档在我编写与Kerberos服务器认证相关的代码时非常有用。以下是我如何与我的Kerberos服务器进行身份验证的具体步骤,但你可能需要根据你的情况进行微调(因此我包含了链接):

public static final int REGISTRATION_TIMEOUT = 30 * 1000; // ms

private static DefaultHttpClient httpClient;

private static final AuthScope SERVER_AUTH_SCOPE =
    new AuthScope("urls to kerberos server", AuthScope.ANY_PORT);


public static DefaultHttpClient getHttpClient(){
    if(httpClient == null){
      httpClient = new DefaultHttpClient();
      final HttpParams params = httpClient.getParams();
      HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT);
      HttpConnectionParams.setSoTimeout(params, REGISTRATION_TIMEOUT);
      ConnManagerParams.setTimeout(params, REGISTRATION_TIMEOUT);
    }
    return httpClient;
  }

  public static boolean authenticate(String username, String password)
  {

    UsernamePasswordCredentials creds =
      new UsernamePasswordCredentials(username, password);
    DefaultHttpClient client = getHttpClient();
    client.getCredentialsProvider().setCredentials(SERVER_AUTH_SCOPE, creds);

    boolean authWorked = false;
    try{
      HttpGet get = new HttpGet(AUTH_URI);
      HttpResponse resp = client.execute(get);
      authWorked = resp.getStatusLine().getStatusCode() != 403
    }
    catch(IOException e){
      Log.e("TAG", "IOException exceptions");
      //TODO maybe do something?
    }
    return authWorked;
  }

3
如果你希望只在LDAP内部操作而不涉及Kerberos,可能会更好。Kerberos可以实现单点登录的优势,但由于你的Android应用程序没有任何凭据,所以它并没有真正帮助你。我猜Google有自己的理由不包括javax.naming到发行版中。这是相当沉重的东西。
你可能能够从java运行库源代码中自行移植这些内容,或者最好使用本机LDAP库。例如,这个链接中的一个
请记住使用安全的LDAP连接或至少安全的身份验证方法。有关此更多信息,请参见此处

2

1

尝试从Oracle学习this教程。我的代码运行得很好。希望所有内容都包含在Android的VM发行版中。


是的,这些库不包含在Android jar中,当我尝试添加它们时会出现问题 :( - Cody
如果你没有这个,那在安卓上就没戏了。请参考[http://groups.google.com/group/android-security-discuss/browse_thread/thread/0fa3facbae29557f] 这个谷歌群组的讨论。 - Michael-O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接