【问题标题】:Authenticating with Active Directory via Kerberos通过 Kerberos 使用 Active Directory 进行身份验证
【发布时间】:2011-12-04 15:16:20
【问题描述】:

我正在构建一个需要不同级别身份验证的 Android 应用程序,我想使用 Active Directory 来实现。

据我所知,使用 Kerberos 是 Microsoft 建议的方式。我如何为 Android 执行此操作?我看到了javax.security.authdoc,但它并没有告诉我太多。

我还在某处看到了 Kerberos 不包含用户组的注释 - 这是真的吗?在那种情况下,我是否也必须以某种方式组合 LDAP?

编辑

这里的主要目标是实现与活动目录的 LDAP 连接,以便对企业 Android 应用程序进行身份验证并为用户提供正确的权限。这里真正的障碍是 Google 遗漏了许多 Java Web Services API 从其移植到 android 的事实。 (即javax.naming)此外,Android jar 中的许多连接机制似乎只是作为遗留代码包含在内,实际上它们实际上什么都不做。

【问题讨论】:

  • 您到底想完成什么?您是否尝试从您的 android 设备连接到某些外部服务器并使用 kerberos 作为身份验证机制?或者您正在尝试使用他们的域凭据在本地登录用户?另请注意,您需要从您的 android 设备到域控制器的开放连接。这意味着,如果您希望您的身份验证方案通过无线方式工作,您必须向整个世界开放您的域控制器的 88 端口。
  • 我正在尝试对用户进行身份验证,并根据他们在 Active Directory 中的组成员身份授予他们对 android 应用程序特定部分的访问权限。我想我已经找到了一种方法,但我还不能在 Android 应用程序上测试它。

标签: java android authentication active-directory kerberos


【解决方案1】:

为此,您最好完全留在 LDAP 中,不要冒险进入 kerberos。 Kerberos 为您提供了单点登录的优势,但由于您的 android 应用程序没有任何凭据,它并不能真正帮助您。我猜谷歌有自己的理由不将 javax.naming 包含在发行版中。这是相当沉重的东西。

您可以自己从 java 运行时库源中移植这些东西,或者最好使用本机 LDAP 库。例如这个one

请记住使用安全的 LDAP 连接或至少使用安全的身份验证方法。有关此的更多信息是here

【讨论】:

    【解决方案2】:

    当我编写代码以向我的 Kerberos 服务器进行身份验证时,我发现 documentation here 非常有用。以下是我使用我的 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】:

      您是否考虑过使用JCIFS?基于[1][2]this site这些问题,JCIFS在Android下工作。 JCIFS 站点有一个simple NTLM Authenticator example 可以帮助您入门。但是,基于this Samba list message,您将需要使用 LDAP 和自定义代码来获取用户的组。

      【讨论】:

        【解决方案4】:

        试试 Oracle 的 this 教程。我的代码喜欢魅力。希望所有内容都包含在 Android 的 VM 发行版中。

        【讨论】:

        猜你喜欢
        • 2023-03-27
        • 1970-01-01
        • 2017-12-29
        • 2017-04-06
        • 2020-02-16
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2016-05-12
        相关资源
        最近更新 更多