Java Kerberos使用logincontext设置委托标志

问题描述 投票:0回答:2

我正在使用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);
java kerberos
2个回答
0
投票

我用来快速和脏的解决方案是更新apache httpcomponents库。我下载了源代码并修改了一行代码以使双跃点场景工作。在类GGSSchemeBase.java中,函数createGSSContext,我在第138行添加了一行,其中包含:

gssContext.requestCredDeleg(true);

现在,这会强制每个kerberos交互创建带凭证委派的票证。根据我的需要,这就足够了。理想情况下,可以修改其中一个更高级别的类以接收额外的GSS标志。然而,这是另一天的斗争。


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

© www.soinside.com 2019 - 2024. All rights reserved.