我想用基于Java的selenium测试一个web应用程序 . Web应用程序的身份验证基于AD / Kerberos作为Single Sing On的类型 . 因此,对于我的测试,我必须冒充其他用户(不是我的Windows登录) . 所以我想用Java进行AD身份验证,然后以某种方式将kerberos令牌或经过身份验证的登录对象传递给webdriver / browser .

我还找到了一个好看的c#解决方案(http://www.deafops.com/Blog/2017/01/Impersonate-user-Selenium),但没有Java示例 .

stackoverflow中的大多数Jave条目都是关于浏览器身份验证弹出窗口,但我们的应用程序没有弹出(没有AD身份验证,webapp首先重定向到气闸WAF) .

Java身份验证实际上工作正常(注意:https://venkatsadasivam.com/2014/01/03/java-sample-active-directory-authentication-code/

Hashtable<Object, Object> env = new Hashtable<Object, Object>();
env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY_CLASS);
env.put(Context.PROVIDER_URL, ldapServerUrls[currentLdapUrlIndex]);
env.put(Context.SECURITY_PRINCIPAL, username + "@" + domainName);
env.put(Context.SECURITY_CREDENTIALS, password);
DirContext ctx = new InitialDirContext(env);

我对身份验证不太熟悉,上面的代码可以运行,我可以进行身份验证 . 我不确定DirContext,它还包含kerberos票吗?我可以将它传递给selenium webdriver浏览器吗?

有人之前实现了这样的事情吗?

谢谢,RKA


ADDITONAL INFO:与此同时,我能够登录

LoginContext lc = new LoginContext()
lc.login();

结果:

Client Principal = TEST@EXAMPLE.COM Server Principal = krbtgt/EXAMPLE.COM@EXAMPLE.COM Session Key = EncryptionKey:keyType = 18 keyBytes(hex dump)= 0000:40 31 46 1C 84 33 53 38 9B D8 2A 8A FA公元前64年2A @ 1F..3S8 .... d . 0010:70 BC ...........` . 可转发票证虚假转发票证虚假可转让票证虚假代理票证虚假过期票证虚假可更新票证虚假初始票证错误验证时间=星期一5月28日16:08:04 CEST 2018开始时间=星期一5月28日16:08:04 CEST 2018结束时间= Tue May 29 02:08:04 CEST 2018 Renew Till = null Client Addresses Null] - >找到一张Kerberos票证Kerberosticket:[B @ 55c53a33票证:YYIEEjCCBA6gAwIBBaEIGwZBMi5MT0OiGzAZoAM ....

现在我尝试将此kerberos票证传递给webdrivers请求

final WebDriver driver = new HtmlUnitDriver() {
    protected WebClient modifyWebClient(WebClient client) {

    client.addRequestHeader("Authorization", "Negotiate " + ticket);
        return client;
    }
};

但这不起作用,我总是得到“400 Bad Request”

知道如何将kerberos令牌传递给seleniums webdriver吗?

谢谢,关心RKA