我使用的是apache httpcomponents 4.5.3。以及用于处理对IIS的Kerberos身份验证的java Krb5LoginModule。 IIS设置为仅接受Kerberos身份验证。这对于单跳场景正如预期的那样工作。我需要将kerberos票证标记为“可以委派”,因此它将从IIS转到SSAS服务器。我有一个python和.net库在同一个IIS服务器上使用Kerberos,所以我知道它有效。 java库需要设置“ok委托”标志,但我无法弄清楚如何设置它。我正在使用java的logincontext和apache的httpclient来进行调用。
为了让您了解代码,这里是:
LoginContext context = null;
try {
// Create a LoginContext with a callback handler
context = new LoginContext(name, callbackHandler);
// Perform authentication
context.login();
} catch (LoginException e) {
System.err.println("Login failed");
e.printStackTrace();
System.exit(-1);
}
// Perform action as authenticated user
Subject subject = context.getSubject();
if (verbose) {
System.out.println(subject.toString());
} else {
System.out.println("Authenticated principal: " +
subject.getPrincipals());
}
Subject.doAs(subject, action);
答案 0 :(得分:0)
我用于快速和脏的解决方案是更新apache httpcomponents库。我下载了源代码并修改了一行代码以使双跃点场景工作。在GGSSchemeBase.java类中,函数createGSSContext,我在第138行添加了一行代码:
gssContext.requestCredDeleg(true);
现在强制每个kerberos交互创建带凭证委派的票证。根据我的需要,这就足够了。理想情况下,可以修改其中一个更高级别的类以接收额外的GSS标志。然而,这是另一天的斗争。
答案 1 :(得分:0)
作为状态here,您可以扩展SPNegoScheme类(扩展GGSSchemeBase)并覆盖调用createGSSContext的generateGSSToken方法。您必须创建一个新的createGSSContext方法并添加'gssContext.requestCredDeleg(true);'。
然后,您可以使用如下构建器创建HttpClient:
HttpClientBuilder builder = HttpClientBuilder.create();
Lookup<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create().register(AuthSchemes.SPNEGO, new YourOwnSPNegoSchemeFactory()).build();
builder.setDefaultAuthSchemeRegistry(authSchemeRegistry);
YourOwnSPNegoSchemaFactory是扩展SPNegoSchemaFactory的类,并且能够创建和实例化您自己的SPNegoSchema扩展。