簡體   English   中英

使用logincontext的Java Kerberos設置委托標志

[英]Java Kerberos set delegate flag using logincontext

我正在使用apache httpcomponents 4.5.3。 和Java Krb5LoginModule處理對IIS的Kerberos身份驗證。 IIS設置為僅接受Kerberos身份驗證。 對於單躍點方案,這可以按預期工作。 我需要將kerberos票證標記為“可以委托”,這樣它才能從IIS到SSAS服務器。 我在同一IIS服務器上有一個使用Kerberos的python和.net庫,因此我知道它可以工作。 Java庫需要設置“可以委托”標志,但是我不知道如何設置它。 我正在使用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);

快速而又骯臟的解決方案是更新apache httpcomponents庫。 我下載了源代碼並修改了一行代碼以使雙跳方案起作用。 在GGSSchemeBase.java類的函數createGSSContext中,我在第138行添加了一行,內容為:

gssContext.requestCredDeleg(true);

現在,這迫使每個Kerberos交互都創建帶有憑證委派的票證。 對於我的需求,這足夠了。 理想情況下,可以修改更高級別的類別之一,以引入其他GSS標志。 但是,那是另一天的斗爭。

作為此處的狀態,您可以擴展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擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM