Tengo una aplicación basada en la aplicación web que toma el contenido de un formulario web que contiene un nombre de usuario y contraseña y se autentica mediante kerberos para un dominio basado en Windows.

El KDC dirección parecer está configurado para asignar las direcciones IP a cada una de las operaciones de búsqueda y esto puede ser confirmado mediante el comando ping desde la línea de comandos.

La llamada responde de inmediato para la mayoría de las peticiones, pero la respuesta es lenta (de 5 a 10 segundos o incluso más) de forma intermitente. Creo que esto puede ser debido a que el controlador de dominio es utilizado.

He tratado de activar el registro de kerberos, pero la dirección IP del controlador de dominio no está demostrado. ¿Cómo puedo encender más el registro detallado para tratar de identificar chunga controladores de dominio, por favor?

El código de extracto de fuentes el bordillo de la acera.conf y kerb_context.conf desde el sistema de archivos.

El bordillo de la acera.conf es:

[libdefaults]
default_realm = EXAMPLE.COM

[realms]
CYMRU.NHS.UK = {
        kdc = example.com:88
        admin_server = example.com
        kpasswd_server = example.com
}

La kerb_context.conf es:

 primaryLoginContext {
        com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache=false
        refreshKrb5Config=true
        debug=true;
};

La fuente de ejemplo es:

static NadexUser executePerformLogin(String username, String password) throws LoginException {
            char[] passwd = password.toCharArray();
            String kerbConf = ERXFileUtilities.pathForResourceNamed("nadex/kerb.conf", "RSCorp", null);
            String kerbContextConf = ERXFileUtilities.pathURLForResourceNamed("nadex/kerb_context.conf", "RSCorp", null).toExternalForm();
            System.setProperty("java.security.krb5.conf", kerbConf);
            System.setProperty("java.security.auth.login.config", kerbContextConf);
            try {
                    LoginContext lc = new LoginContext("primaryLoginContext", new UserNamePasswordCallbackHandler(username, password));
                    lc.login();
                    return new _NadexUser(lc.getSubject());
            }
            catch (javax.security.auth.login.LoginException le) {
                    throw new LoginException("Failed to login : " + le.getLocalizedMessage(), le);
            }
    }

OriginalEl autor Mark Wardle | 2013-03-13

2 Comentarios

  1. 22

    Puede habilitar el registro de configuración del sistema de propiedad sun.security.krb5.debug a true.

    Ver Documentación de Oracle

    -Dsun.security.krb5.debug=true Puedo copiar y pegar esto suficientes veces, así que pensé en hacer un one-liner.

    OriginalEl autor Ales Dolecek

  2. 1

    No he encontrado un camino para convertirse en tal registro detallado, pero en su lugar decidió adoptar un enfoque diferente. El siguiente código es una aplicación independiente que simplemente necesita un jaas.conf archivo de configuración en el mismo directorio.

    Un ejemplo de jaas.conf para usar con esta pequeña aplicación de prueba se muestra:

    primaryLoginContext {
            com.sun.security.auth.module.Krb5LoginModule required
            useTicketCache=false
            refreshKrb5Config=true
            debug=false;
    };
    

    Este código está cuidado al establecer la propiedad del sistema solar.net.inetaddr.ttl para evitar el almacenamiento en caché de java los resultados de la búsqueda de DNS. Para mi caso, la búsqueda de DNS cambios en cada solicitud. Es un tosco pedazo de código, sino de demostrar cualquier mal configurado o la realización de Kdc dentro de la red.

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.math.BigDecimal;
    import java.math.RoundingMode;
    import java.net.InetAddress;
    import java.net.MalformedURLException;
    import java.net.UnknownHostException;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Set;
    import java.util.Vector;
    
    import javax.security.auth.callback.Callback;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.callback.NameCallback;
    import javax.security.auth.callback.PasswordCallback;
    import javax.security.auth.callback.UnsupportedCallbackException;
    import javax.security.auth.login.LoginContext;
    
    public class TestNadex {
        private static final String DEFAULT_HOST = "cymru.nhs.uk";
    
        public static void main(String[] args) {
            System.setProperty("sun.net.inetaddr.ttl", "0");
            String username=null;
            String password=null;
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("Enter username: ");
                username = br.readLine().trim();
                System.out.println("Enter password: ");
                password = br.readLine().trim();
                testHost(DEFAULT_HOST, username, password);
            } catch (IOException e1) {
                //TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    
        static void testHost(String host, String username, String password) {
            HashMap<String, Vector<Long>> results = new HashMap<String, Vector<Long>>();
            for (int i=0; i<200; i++) {
                InetAddress ia;
                try {
                    ia = InetAddress.getByName(host);
                    long startTime = System.currentTimeMillis();
                    executePerformLogin(ia.getHostAddress(), username, password);
                    long endTime = System.currentTimeMillis();
                    long duration = endTime - startTime;
                    if (results.containsKey(ia.toString()) == false) {
                        Vector<Long> v = new Vector<Long>();
                        v.add(duration);
                        results.put(ia.toString(), v);
                    }
                    else {
                        Vector<Long> v = results.get(ia.toString());
                        v.add(duration);
                    }
                    Thread.sleep(1000);
                } catch (UnknownHostException e) {
                    System.out.println("Unknown host: "  + host);
                    System.exit(1);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    //TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
            Set<String> keys = results.keySet();
            for (String key : keys) {
                System.out.println("For address: " + key);
                Vector<Long> times = results.get(key);
                int count = times.size();
                long total = 0;
                for (Long t : times) {
                    System.out.println(t + " milliseconds");
                    total += t;
                }
                System.out.println("Mean duration: " + new BigDecimal(total).divide(new BigDecimal(count), RoundingMode.HALF_UP));
            }
        }
    
        static void executePerformLogin(String hostname, String username, String password) throws MalformedURLException {
            System.setProperty("java.security.krb5.realm", "CYMRU.NHS.UK");
            System.setProperty("java.security.krb5.kdc", hostname);
            File jaas = new File("jaas.conf");
            String jaasconf = jaas.toURI().toURL().toExternalForm();
            System.setProperty("java.security.auth.login.config", jaasconf);
            //     System.setProperty("java.security.krb5.realm", "cymru.nhs.uk");
            //     System.setProperty("java.security.krb5.kdc", "cymru.nhs.uk");
            try {
                System.out.println("Performing NADEX login for username: " + username + " at " + new Date() + " to server " + hostname);
                LoginContext lc = new LoginContext("primaryLoginContext", new UserNamePasswordCallbackHandler(username, password));
                lc.login();
                System.out.println("Successful login for " + lc.getSubject().toString() + " at " + new Date());
            }
            catch (javax.security.auth.login.LoginException le) {
                System.err.println("Failed to login: " + le);
            }
        }
    
        public static class UserNamePasswordCallbackHandler implements CallbackHandler {
            private final String _userName;
            private final String _password;
    
            public UserNamePasswordCallbackHandler(String userName, String password) {
                _userName = userName;
                _password = password;
            }
    
            public void handle(Callback[] callbacks) throws IOException,
            UnsupportedCallbackException {
                for (Callback callback : callbacks) {
                    if (callback instanceof NameCallback && _userName != null) {
                        ((NameCallback) callback).setName(_userName);
                    }
                    else if (callback instanceof PasswordCallback && _password != null) {
                        ((PasswordCallback) callback).setPassword(_password.toCharArray());
                    }
                }
            }
        }
    }
    

    OriginalEl autor Mark Wardle

Dejar respuesta

Please enter your comment!
Please enter your name here