Java Kerberos使用logincontext设置委托标志

时间:2017-05-31 20:45:32

标签: java kerberos

我使用的是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);

2 个答案:

答案 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扩展。