2

我们正在尝试使用带有 JAAS 的独立 Java 客户端将 WAFFLE 用于 SSO。我们在 jaas.conf 中提到了 waffle.jaas.WindowsLoginModule,但它提示输入用户名和密码,我们认为这不是 SSO 的理想解决方案。有人可以建议如何避免这种情况吗?

仅供参考 - 我们没有使用任何网络/应用服务器。

4

3 回答 3

1

我相信您将需要 SSO 的服务器和客户端。您可以看一下这个示例,它不使用登录模块,而是使用 WAFFLE 中包含的底层 WindowsSecurityContext 类来回传递 kerberos 令牌以获取登录用户。

于 2015-05-11T18:02:07.230 回答
0

以下是在不使用服务器的情况下使用独立 Java 客户端的 Waffle 进行单点登录的步骤。

  1. 创建客户端凭据
  2. 使用 WindowsSecurityContextImpl 的 initializeSecurityContext 获取服务票证。
  3. 使用 WindowsAuthProviderImpl 的 accessSecurityContext 获取 WindowsIdentity

原文链接https://exceptionshub.com/getting-kerberos-service-ticket-using-waffle-in-java.html

对于客户端-服务器 sso,您应该遵循https://code.dblock.org/2010/04/08/pure-java-waffle.html 下面的代码描述了使用 kerberos 的独立 java sso。

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();
    }
  }
}
于 2020-01-13T07:48:53.853 回答
-1

而不是使用华夫饼并使其复杂化。您可以轻松地使用 System.getProperty(“user.name”) 来提供用户名。

于 2015-05-13T05:16:11.403 回答