Как использовать WAFFLE для единого входа с помощью отдельного Java-клиента

Мы пытаемся использовать WAFFLE для единого входа с помощью отдельного Java-клиента с JAAS. Мы упоминали waffle.jaas.WindowsLoginModule в нашем jaas.conf, но он запрашивает имя пользователя, пароль, который, по нашему мнению, не является идеальным решением для единого входа. Кто-нибудь может подсказать, как этого избежать?

К вашему сведению - мы не используем веб-сервер / сервер приложений.

2 ответа

Я считаю, что для единого входа вам понадобится и сервер, и клиент. Вы можете взглянуть на этот пример, он не использует модуль входа в систему, а базовые классы WindowsSecurityContext, включенные в WAFFLE, для передачи токенов kerberos вперед и назад для получения зарегистрированного пользователя.

Ниже приведены шаги для выполнения единого входа с использованием Waffle для автономного клиента Java без использования сервера.

  1. Создать учетные данные клиента
  2. Получите билет службы, используя initializeSecurityContext из WindowsSecurityContextImpl.
  3. Получите WindowsIdentity, используя accessSecurityContext из WindowsAuthProviderImpl

Исходная ссылка https://exceptionshub.com/getting-kerberos-service-ticket-using-waffle-in-java.html

Для клиент-серверного sso вы должны следовать https://code.dblock.org/2010/04/08/pure-java-waffle.html. В приведенном ниже коде изображен автономный java sso с использованием kerberos.

import com.sun.jna.platform.win32.Sspi;
import waffle.windows.auth.IWindowsCredentialsHandle;
import waffle.windows.auth.IWindowsIdentity;
import waffle.windows.auth.IWindowsSecurityContext;
import waffle.windows.auth.impl.WindowsAccountImpl;
import waffle.windows.auth.impl.WindowsAuthProviderImpl;
import waffle.windows.auth.impl.WindowsCredentialsHandleImpl;
import waffle.windows.auth.impl.WindowsSecurityContextImpl;

public class KerberosSingleSignOn {
  public static void main() {
    try {
      System.out.println(getWindowsIdentity().getFqn());
    }
    catch (Exception e) {
      e.printStackTrace();
    }
  }

  public static IWindowsIdentity getWindowsIdentity() throws Exception {
    try {
      byte[] kerberosToken = getServiceTicketSSPI();
      WindowsAuthProviderImpl provider = new WindowsAuthProviderImpl();
      IWindowsSecurityContext securityContext = provider
        .acceptSecurityToken("client-connection", kerberosToken, "Kerberos");
      return securityContext.getIdentity();
    }
    catch (Exception e) {
      throw new Exception("Failed to process kerberos token");
    }
  }

  public static byte[] getServiceTicketSSPI() throws Exception {
    final String securityPackage = "Kerberos";
    IWindowsCredentialsHandle clientCredentials = null;
    WindowsSecurityContextImpl clientContext = null;
    final String currentUser = WindowsAccountImpl.getCurrentUsername();
    try {
      clientCredentials = WindowsCredentialsHandleImpl.getCurrent(securityPackage);
      clientCredentials.initialize();
      // initial client security context
      clientContext = new WindowsSecurityContextImpl();
      clientContext.setCredentialsHandle(clientCredentials.getHandle());
      /*OR 
       clientContext.setCredentialsHandle(clientCredentials);
       */
      clientContext.setSecurityPackage(securityPackage);
      final Sspi.SecBufferDesc continueToken = null;
      do {
        System.out.println("Using current username: " + currentUser);
        clientContext.initialize(clientContext.getHandle(), continueToken, currentUser);
      }
      while (clientContext.isContinue());

      return clientContext.getToken();
    }
    catch (Exception e) {
      throw new Exception("Failed to process kerberos token");
    }
    finally {
      if (clientContext != null)
        clientContext.dispose();
      if (clientCredentials != null)
        clientCredentials.dispose();
    }
  }
}

Вместо использования вафли и усложнения. Вы можете легко использовать System.getProperty("user.name") предоставит имя пользователя.

Другие вопросы по тегам