我正在构建一个需要不同级别身份验证的Android应用程序,我想使用Active Directory这样做。
据我所知,使用Kerberos是微软建议的方式。我该如何为Android做这个?我看到了javax.security.auth
doc,但它并没有告诉我太多。
我还在某处看到Kerberos不包含用户组的说明 - 这是真的吗?在这种情况下,我是否还必须以某种方式组合LDAP?
编辑
此处的主要目标是实现与活动目录的LDAP连接,以便对企业Android应用程序进行身份验证并为用户提供正确的权限。这里的真正障碍是Google将许多Java Web Services API从它的端口遗漏到了android。 (即javax.naming
)此外,Android jar中的许多连接机制似乎只作为遗留代码包含在内,实际上它们实际上什么都不做。
答案 0 :(得分:3)
当我编写代码以使用我的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;
}
答案 1 :(得分:3)
为此你可能会更好地完全呆在LDAP中,不要冒险进入kerberos。 Kerberos为您提供单点登录的优势,但由于您的Android应用程序没有任何凭据,因此它并没有真正帮助您。我猜google有自己的理由不将javax.naming包含在发行版中。这是非常重的东西。
您可以自己从Java运行时库源中移植这些东西,或者最好使用本机LDAP库。例如one。
请记住使用安全的LDAP连接或至少是安全的身份验证方法。有关这方面的更多信息,请here。
答案 2 :(得分:2)
您是否看过使用JCIFS?基于这些问题[1] [2]和this site,JCIFS可以在Android下运行。 JCIFS站点有一个simple NTLM Authenticator example,可以帮助您入门。但是,根据this Samba list message,您需要使用LDAP和自定义代码来获取用户的组。
答案 3 :(得分:1)
尝试使用Oracle的this教程。我的代码喜欢魅力。希望一切都包含在Android的VM发行版中。