Spec-Zone .ru
спецификации, руководства, описания, API
|
HTTP SPNEGO поддерживает Согласовывать схему аутентификации в передаче HTTP. SPNEGO поддерживает типы аутентификации:
Веб-сервер отвечает
HTTP/1.1 401 Unauthorized WWW-Authenticate: Negotiate
клиент должен будет отправить заголовок как
Authorization: Negotiate YY.....
аутентифицировать себя к серверу
Ответы веб-сервера с
HTTP/1.1 407 Proxy Authentication Required Proxy-Authenticate: Negotiate
клиент должен будет отправить заголовок как
Proxy-Authorization: Negotiate YY.....
аутентифицировать себя к прокси-серверу
Эта функция поддерживает оба типа аутентификации.
Нет никакой новой общедоступной API-функции, включенной в новую функцию, но несколько конфигураций необходимы, чтобы выполнить передачу успеха:
Так как механизм SPNEGO вызовет JGSS, который по очереди вызывает Kerberos модуль входа в систему V5, чтобы сделать реальные работы. Kerberos 5 конфигураций необходим. Это включает следующее:
java.security.krb5.conf
. Например:java -Djava.security.krb5.conf=krb5.conf \ -Djavax.security.auth.useSubjectCredsOnly=false \ ClassName
com.sun.security.jgss.krb5.initiate
.spnegoLogin.conf
: com.sun.security.jgss.krb5.initiate { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true; };
и выполненный java с:
java -Djava.security.krb5.conf=krb5.conf \ -Djava.security.auth.login.config=spnegoLogin.conf \ -Djavax.security.auth.useSubjectCredsOnly=false \ ClassName
Точно так же как любая другая схема аутентификации HTTP клиент может обеспечить специализированное java.net.Authenticator
чтобы подать имя пользователя и пароль к HTTP модуль SPNEGO, если они необходимы (то есть нет никакого учетного доступного кэша). Единственная информация об аутентификации должна была быть проверена в Вашем Аутентификаторе, схема, которая может быть получена с getRequestingScheme()
. Значение должно быть, "Согласовывают".
class MyAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication () { if (getRequestingScheme().equalsIgnoreCase("negotiate")) { String krb5user; char[] krb5pass; // get krb5user and krb5pass in your own way .... return (new PasswordAuthentication (krb5user, krb5pass)); } else { .... } } }
Отметьте: Согласно спецификации java.net.Authenticator
, это разрабатывается, чтобы получить имя пользователя и пароль одновременно, не, определяют - также principal=xxx
в JAAS конфигурируют файл.
Клиент может все еще обеспечить системное свойство http.auth.preference
обозначить, что определенная схема должна всегда использоваться пока запрос к серверу на это. Можно использовать "SPNEGO" или "Kerberos" для этого системного свойства. "SPNEGO" означает, что Вы предпочитаете ответу схему Negotiate, используя механизм GSS/SPNEGO; "Kerberos" означает, что Вы предпочитаете ответу схему Negotiate, используя механизм GSS/Kerberos. Обычно, аутентифицируя против продукта Microsoft, можно использовать "SPNEGO". Значение "Kerberos" также работает на серверы Microsoft. Только необходимо, когда Вы встречаетесь с сервером, который знает, Согласовывают, но не знает о SPNEGO.
Если http.auth.preference
не устанавливается, внутренний порядок choosen:
Замеченный, что Kerberos не появляется в этом списке, с тех пор всякий раз, когда Согласовывают, поддерживается, GSS/SPNEGO всегда выбирается.
Если сервер обеспечил, больше чем одна схема аутентификации (включая Согласовывают), согласно порядку обработки, упомянутому в последнем разделе, Java попытается бросить вызов схеме Negotiate. Однако, если протокол не может быть установлен успешно (например; kerberos конфигурация не корректна, или имя хоста сервера не записывается в DB принципала KDC, или имя пользователя и пароль, обеспеченный Аутентификатором, являются неправильными), тогда вторая самая сильная схема будет автоматически использоваться.
Отметьте: Еслиhttp.auth.preference
устанавливается в SPNEGO или Kerberos, тогда SPNEGO предполагает, что Вы только хотите попробовать схему Negotiate, даже если это перестало работать. SPNEGO не будет, нейтрализация к любой другой схеме и Вашей программе бросит IOException
высказывание этого получило 401 или 407 ошибок от ответа HTTP. Вы должны подготовить эти файлы, чтобы получить защищенный файл:
Листинг кода для RunHttpSpnego.java
import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.net.URL; public class RunHttpSpnego { static final String kuser = "username"; // your account name static final String kpass = "password"; // your password for the account static class MyAuthenticator extends Authenticator { public PasswordAuthentication getPasswordAuthentication() { // I haven't checked getRequestingScheme() here, since for NTLM // and Negotiate, the usrname and password are all the same. System.err.println("Feeding username and password for "
+ getRequestingScheme()); return (new PasswordAuthentication(kuser, kpass.toCharArray())); } } public static void main(String[] args) throws Exception { Authenticator.setDefault(new MyAuthenticator()); URL url = new URL(args[0]); InputStream ins = url.openConnection().getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(ins)); String str; while((str = reader.readLine()) != null) System.out.println(str); } }
Листинг кода для krb.conf
[libdefaults] default_realm = AD.LOCAL [realms] AD.LOCAL = { kdc = kdc.ad.local }
Листинг кода для login.conf
com.sun.security.jgss.krb5.initiate { com.sun.security.auth.module.Krb5LoginModule required
doNotPrompt=false useTicketCache=true; };
Затем, скомпилировать RunHttpSpnego.java
и выполненный
java -Djava.security.krb5.conf=krb5.conf \ -Djava.security.auth.login.config=login.conf \ -Djavax.security.auth.useSubjectCredsOnly=false \ RunHttpSpnego \ http://www.ad.local/hello/hello.html
Вы будете видеть:
Feeding username and password for Negotiate <h1>Hello, You got me!</h1>
Фактически, если Вы работаете на машине Windows как доменный пользователь, или, Вы работаете на Linux или машине Соляриса, которая уже вышла kinit
команда и получила учетный кэш. Класс MyAuthenticator
будет полностью проигнорирован, и вывод будет просто
<h1>Hello, You got me!</h1>
который показывает, что с именем пользователя и паролем не консультируются. Это - так называемый Единственный Вход в систему.
Кроме того, можно только работать
java RunHttpSpnego \ http://www.ad.local/hello/hello.html
видеть, как нейтрализация делается, когда Вы будете видеть
Feeding username and password for ntlm <h1>Hello, You got me!</h1>