Получите пользователя Windows, вошедшего в систему в WebApp (JAVA)

Я застрял с этой задачей уже несколько дней. В форме входа в мое веб-приложение, прежде чем пользователь сможет ввести имя пользователя и пароль, я хочу получить в запросе имя пользователя своей учетной записи Windows. После долгих исследований я обнаружил, что Kerberos — это то, что мне нужно использовать, но я не знаю, как это сделать. У меня есть доступ к серверу Active Directory, поэтому я создал имя участника службы, установил на Java соединение с AD, но мне не удается получить пользователя Windows.

Теперь я пытаюсь использовать Waffle, и, как я читал, это так же просто, как импортировать несколько JAR-файлов и в файле JSP получить основное имя (предполагается, что это пользователь Windows), но, как я уже сказал, я не мог т сделать это.

Кто-нибудь уже делал что-то подобное??

Любая помощь будет ДЕЙСТВИТЕЛЬНО оценена,

Заранее спасибо.

ОБНОВИТЬ:

Как вы просили, вот что я сделал до сих пор:

На WServer 2012 R2 (где у меня есть AD) я создал пользователя с именем santi.mitrol.net.

Зарегистрируйте spn для этого пользователя с помощью следующей команды:

setspn -A HTTP/santi.mitrol.net santi.mitrol.net

и после этого я создал связанный keytab:

ktpass -out C:\temp\test.keytab -princ HTTP/[email protected] -mapUser santi.mitrol.net -mapOp set -pass MYPASS -crypto RC4-HMAC-NT -pType KRB5_NT_PRINCIPAL

После этой настройки я создал этот проект: https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth/src/main, но я не могу заставить его работать...

С Waffle то же самое.. в моем web.xml у меня есть это:

<filter-name>SecurityFilter</filter-name>
<!--<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>-->
<filter-class>net.mitrol.config.activedirectory.CustomFilter</filter-class>

<filter-name>SecurityFilter</filter-name>
<url-pattern>/*</url-pattern>

Но когда я делаю запрос к Tomcat, который я развернул на своем ПК с другого ПК, они получают запрос на ввод учетных данных, а это не то, что мне нужно, мне нужно только получить по запросу пользователя Windows, который зарегистрирован на машине, которая делает запрос.

Спасибо


person Santiago    schedule 27.10.2016    source источник
comment
Покажите нам, что вы уже пробовали.   -  person Adrian K.    schedule 27.10.2016
comment
Возможный дубликат текущего имени компьютера Java и пользователя, вошедшего в систему?   -  person Pritam Banerjee    schedule 27.10.2016


Ответы (1)


Хорошо, через две недели я наконец смог заставить его работать!!!!

Я собираюсь опубликовать весь процесс как можно подробнее, чтобы никто не страдал от того, что я страдал.

В этом процессе я использовал три компьютера в домене DEV-MITROL.LOCAL:

  • Контроллер домена: имя хоста: AR-SRV-DC-007, пользователь: пароль администратора: somePass40

  • Машина Tomcat: ip: 192.168.40.91 (я создал запись DNS на контроллере домена, чтобы разрешить этот IP-адрес для santi.dev-mitrol.net) пользователь: tomcat pass: tomcatPass40

  • Клиентская машина для выполнения запросов к машине Tomcat (она не будет работать должным образом, если вы делаете запрос с той же машины, на которой запущен сервер)

Шаги:

1) Войдя в систему на контроллере домена с правами администратора, вы создали этот SPN:

setspn -A HTTP/santi.dev-mitrol.net tomcat
setspn -A HTTP/santi.dev-mitrol.net.dev-mitrol.local tomcat

2) Найдите пользователя «tomcat» в «Административные инструменты> Пользователи и компьютеры Active Directory» и на вкладке «Делегирование» выберите параметр «Доверять этому пользователю делегирование любой службе (только Kerberos)» и на вкладке «Учетная запись» в «Параметры учетной записи» установите флажок «Не требовать предварительной аутентификации Kerberos».

3) Создайте keytab с помощью этой команды:

ktpass -princ HTTP/[email protected] -mapuser [email protected] -pass * -ptype KRB5_NT_PRINCIPAL -out test.keytab

Пароль, который вы должны использовать здесь: tomcatPass40.

4) Теперь пришло время войти в систему с пользователем tomcat и вставить keytab, созданный по этому пути:

C:\Program Files\Apache Software Foundation\Tomcat 8.5\conf\

Помимо этого, вам нужно создать еще два файла в этой папке:

KRB5.ini

[libdefaults]
default_realm = DEV-MITROL.LOCAL
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
forwardable=true

[realms]
DEV-MITROL.LOCAL = {
kdc = AR-SRV-DC-007
}

[domain_realm]
dev-mitrol.local= DEV-MITROL.LOCAL
.dev-mitrol.local= DEV-MITROL.LOCAL

и JAAS.conf

com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required;
};

com.sun.security.jgss.krb5.accept {
com.sun.security.auth.module.Krb5LoginModule required
storeKey=true
useKeyTab=true
keyTab="file:///C:/Program Files/Apache Software Foundation/Tomcat 8.5/conf/test.keytab"
principal="HTTP/santi.dev-mitrol.net.dev-mitrol.local";
};

5) Отредактируйте файл web.xml, который находится в той же папке, и включите фильтр SPNEGO:

<filter>
    <filter-name>SpnegoHttpFilter</filter-name>
    <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class>
    <init-param>
        <param-name>spnego.allow.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.localhost</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.allow.unsecure.basic</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.client.module</param-name>
        <param-value>com.sun.security.jgss.krb5.initiate</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.krb5.conf</param-name>
        <param-value>krb5.ini</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.conf</param-name>
        <param-value>jaas.conf</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.login.server.module</param-name>
        <param-value>com.sun.security.jgss.krb5.accept</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.prompt.ntlm</param-name>
        <param-value>true</param-value>
    </init-param>

    <init-param>
        <param-name>spnego.logger.level</param-name>
        <param-value>1</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>SpnegoHttpFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

6) Создайте файл JSP в "C:\Program Files\Apache Software Foundation\Tomcat 8.5\webapps\ROOT" со следующим содержимым:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Hello SPNEGO Example</title>
    </head>
    <body>
        Hello <%= request.getRemoteUser() %> !
    </body>
</html> 

7) Если вы выполнили эти шаги, это должно работать, и вы получите по вашему запросу имя пользователя Windows.

Надеюсь, поможет.

person Santiago    schedule 15.11.2016
comment
SSO также возможен с вафлей. я реализовал это в нескольких веб-приложениях. выглядит менее сложным, чем то, что вы сделали. - person Master Azazel; 22.11.2016