Использование GSSManager для проверки билета Kerberos
У меня есть следующий код:
public static void main(String args[]){
try {
//String ticket = "Negotiate YIGCBg...==";
//byte[] kerberosTicket = ticket.getBytes();
byte[] kerberosTicket = Base64.decode("YIGCBg...==");
GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
String user = context.getSrcName().toString();
context.dispose();
} catch (GSSException e) {
e.printStackTrace();
} catch (Base64DecodingException e) {
e.printStackTrace();
}
}
Конечно, это не удается. Вот исключение:
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
Я не знаю, что я должен сделать, чтобы решить это. Честно говоря, я не очень понимаю Kerberos.
Я получил этот билет, отправив 401 с соответствующим заголовкомWWW-Authenticate
с 'Переговоры' в качестве значения. Браузер немедленно отправил тот же запрос сauthorization
заголовок, содержащий этот тикет.
Я надеялся, что смогу проверить билет и определить, кто пользователь.
Нужен ли мне файл keytab? Если да, то с какими учетными данными я бы это запустил? Я пытаюсь использовать билет Kerberos для авторизации на веб-сайте. Могут ли учетные данные быть учетными данными IIS?
Что мне не хватает?
Обновление 1 Из ответа Michael-O я немного погуглил и нашелЭта статьячто привело меня кЭта статья.
Наtable 3
, Я нашел1.3.6.1.5.5.2 SPNEGO
.
Теперь я добавил это к своим учетным данным, следуя примеру из первой статьи. Вот мой код:
public static void main(String args[]){
try {
Oid mechOid = new Oid("1.3.6.1.5.5.2");
GSSManager manager = GSSManager.getInstance();
GSSCredential myCred = manager.createCredential(null,
GSSCredential.DEFAULT_LIFETIME,
mechOid,
GSSCredential.ACCEPT_ONLY);
GSSContext context = manager.createContext(myCred);
byte[] ticket = Base64.decode("YIGCBg...==");
context.acceptSecContext(ticket, 0, ticket.length);
String user = context.getSrcName().toString();
context.dispose();
} catch (GSSException e) {
e.printStackTrace();
} catch (Base64DecodingException e) {
e.printStackTrace();
}
}
Но теперь код не работаетcreateCredential
с этой ошибкой:
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
Вот весь билет:YIGCBgYrBgEFBQKgeDB2oDAwLgYKKwYBBAGCNwICCgYJKoZIgvcSAQICBgkqhkiG9xIBAgIGCisGAQQBgjcCAh6iQgRATlRMTVNTUAABAAAAl7II4g4ADgAyAAAACgAKACgAAAAGAbEdAAAAD0xBUFRPUC0yNDVMSUZFQUNDT1VOVExMQw==