Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Авторизация через spnego


Автор: gasdfgag 14.6.2012, 15:38
Здравствуйте
Возникла необходимость добавить в веб приложение возможность доменной авторизации. Это было сделано с помощью spnego. Все отлично работает, но нужно сделать так, чтобы пользователь не вводил каждый раз логин и пароль (ведь пользователь уже залогинился в винде через доменку). Используем Tomcat 6. Кто сталкивался с такой проблемой, подскажите, куда копать?

Часть файла 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>spnego-client</param-value>
        </init-param>
        
        <init-param>
            <param-name>spnego.krb5.conf</param-name>
            <param-value>krb5.conf</param-value>
        </init-param>
        
        <init-param>
            <param-name>spnego.login.conf</param-name>
            <param-value>login.conf</param-value>
        </init-param>
        
        <init-param>
            <param-name>spnego.preauth.username</param-name>
            <param-value>user</param-value>
        </init-param>
        
        <init-param>
            <param-name>spnego.preauth.password</param-name>
            <param-value>123</param-value>
        </init-param>
        
        <init-param>
            <param-name>spnego.login.server.module</param-name>
            <param-value>spnego-server</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>


Файл krb5.conf:
Код

[libdefaults]
    default_realm = LEASING.LOCAL
    default_tkt_enctypes = simple aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    default_tgs_enctypes = simple aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
    permitted_enctypes   = simple aes128-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc

[realms]
    LEASING.LOCAL  = {
        kdc = dc1.leasing.local:88
        default_domain = leasing.local 
}

[domain_realm]
    dc1.leasing.local = LEASING.LOCAL
    .leasing.local.LOCAL = LEASING.LOCAL 



Файл login.conf:
Код

spnego-client {
    com.sun.security.auth.module.Krb5LoginModule required;
};

spnego-server {
    com.sun.security.auth.module.Krb5LoginModule required
    storeKey=true
    isInitiator=false;
};


Автор: AntonSaburov 14.6.2012, 17:38
Что-то не встречал я возможностей у Tomcat 6 виндовой аутентификации. В 7-ке видел, а в 6-ке - нет.

Автор: gasdfgag 14.6.2012, 23:15
тут наверное дело не в версии Tomcat, а именно в использовании spnego для аутентификации

Автор: AntonSaburov 15.6.2012, 11:48
Я этим вопросом не занимался, но на 7-ку такой раздел есть - http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html
А в 6-ке такого нет. Хотя опять же т.к. не занимался мое суждение крайне поверхностно.

Автор: gasdfgag 15.6.2012, 14:27
Перечитал уже кучу форумов, документации и статей, в том числе и по Вашей ссылке. Никакого результата не добился. Выяснил так же, что если в IE включить опцию "Разрешить встроенную проверку подлинности Windows", то выскакивает ошибка, если запускать на локалхосте:
Код

javax.servlet.ServletException: GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:233)


root cause 

GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)
    sun.security.jgss.GSSHeader.<init>(Unknown Source)
    sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
    sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
    sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(Unknown Source)
    sun.security.jgss.spnego.SpNegoContext.acceptSecContext(Unknown Source)
    sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
    sun.security.jgss.GSSContextImpl.acceptSecContext(Unknown Source)
    net.sourceforge.spnego.SpnegoAuthenticator.doSpnegoAuth(SpnegoAuthenticator.java:444)
    net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:283)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)




Если на другом компьютере в домене:
Код

exception 

javax.servlet.ServletException: GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:233)


root cause 

GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
    sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:741)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:858)
    sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:532)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    net.sourceforge.spnego.SpnegoAuthenticator.doSpnegoAuth(SpnegoAuthenticator.java:444)
    net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:283)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)


root cause 

KrbException: Checksum failed
    sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:85)
    sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:77)
    sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:168)
    sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:268)
    sun.security.krb5.KrbApReq.<init>(KrbApReq.java:134)
    sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:79)
    sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:724)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:858)
    sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:532)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    net.sourceforge.spnego.SpnegoAuthenticator.doSpnegoAuth(SpnegoAuthenticator.java:444)
    net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:283)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)


root cause 

java.security.GeneralSecurityException: Checksum failed
    sun.security.krb5.internal.crypto.dk.ArcFourCrypto.decrypt(ArcFourCrypto.java:388)
    sun.security.krb5.internal.crypto.ArcFourHmac.decrypt(ArcFourHmac.java:74)
    sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:83)
    sun.security.krb5.internal.crypto.ArcFourHmacEType.decrypt(ArcFourHmacEType.java:77)
    sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:168)
    sun.security.krb5.KrbApReq.authenticate(KrbApReq.java:268)
    sun.security.krb5.KrbApReq.<init>(KrbApReq.java:134)
    sun.security.jgss.krb5.InitSecContextToken.<init>(InitSecContextToken.java:79)
    sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:724)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:858)
    sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:532)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:323)
    sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:267)
    net.sourceforge.spnego.SpnegoAuthenticator.doSpnegoAuth(SpnegoAuthenticator.java:444)
    net.sourceforge.spnego.SpnegoAuthenticator.authenticate(SpnegoAuthenticator.java:283)
    net.sourceforge.spnego.SpnegoHttpFilter.doFilter(SpnegoHttpFilter.java:229)




Начал смотреть в http-снифере. При включенной опции IE "Разрешить встроенную проверку подлинности Windows", происходит negotiate аутентификация (без запроса логина и пароля), при отключенной - basic аутентификация (с запросом логина и пароля). И во время negotiate аутентификации выскакивают эти ошибки

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)