我有一个linux\java6客户端,它将使用NTLM向sharepoint2010进行身份验证,然后使用Apache Commons HttpClient发送HTTP REST web服务。
我可以使用NTLM做到这一点,但我想使用与kerberos身份验证相同的REST API来访问sharepoint 2010。
有没有示例如何使用kerberos sharepoint通过HTTP进行身份验证和发送REST?(最好使用HttpClient)
附注:我没有访问sharepoint代码的权限,但我有访问sharepoint管理员配置的权限。下面是我使用NTLM进行身份验证的大致方式:
HttpClient httpClient = new HttpClient(new SimpleHttpConnectionManager(true));
AuthPolicy.registerAuthScheme(AuthPolicy.NTLM, JCIFS_NTLMScheme.class);
String localHostName = Inet4Address.getLocalHost().getHostName();
authscope = new AuthScope(uri.getHost(), AuthScope.ANY_PORT);
httpClient.getState().setCredentials(authscope,new NTCredentials(
getUsername(),getPassword(),localHostName,getDomain()));
// after the initial ntlm auth I can call my REST service with "httpClient.executeMethod"
int status = httpClient.executeMethod(new GetMethod(accessURI + "/sitecollection/info"));发布于 2012-05-29 21:49:15
请确认您的环境已正确设置为Kerberos,这可以通过运行kinit来实现。如果失败,您将需要确保您的krb5.ini (windows)或krb5.conf (linux)设置为正确地指向您的域控制器。
一旦确认Kerberos正常工作,就可以使用HttpClient中的示例代码,如下所示。
请注意,有许多可能导致Kerberos失败的问题,例如时间同步、支持的加密类型、跨域森林的信任关系以及确保您的客户端与服务器处于单独的机器上也是值得的。
以下是可从HttpClient下载中获得的示例代码,您需要确保您的JAAS配置和krb5.conf或ini是正确的!
public class ClientKerberosAuthentication {
public static void main(String[] args) throws Exception {
System.setProperty("java.security.auth.login.config", "login.conf");
System.setProperty("java.security.krb5.conf", "krb5.conf");
System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, new SPNegoSchemeFactory());
Credentials use_jaas_creds = new Credentials() {
public String getPassword() {
return null;
}
public Principal getUserPrincipal() {
return null;
}
};
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(null, -1, null),
use_jaas_creds);
HttpUriRequest request = new HttpGet("http://kerberoshost/");
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println("----------------------------------------");
if (entity != null) {
System.out.println(EntityUtils.toString(entity));
}
System.out.println("----------------------------------------");
// This ensures the connection gets released back to the manager
EntityUtils.consume(entity);
} finally {
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}
}https://stackoverflow.com/questions/10722215
复制相似问题