具有ADFS SAML身份验证的Java Web服务客户端

时间:2019-10-02 15:28:34

标签: java web-services soap saml adfs

我们正尝试连接到具有 ADFS SAML 身份验证的网络服务(来自 Java )。

我看到的所有示例都使用基于HTTPS的基本身份验证。 (我现在只是使用HttpsURLConnection发出请求,而不使用Axis或JAX-WS之类的东西)

我不确定如何进行 ADFS SAML 身份验证。到目前为止,这是我所了解的(对 SAML 不太了解):

  1. 我提出一个请求,传递 username / password 并获得 身份验证令牌返回
  2. 保存身份验证令牌
  3. 将令牌作为某些 SOAP 属性传递给我在调用中的调用 网络服务
  4. 上的实际操作
  5. 我不知道该身份验证令牌放在哪个属性下

我的上述方法正确吗?如果是这样,我是否可以使用某些库来完成所有这些工作?

如果没有,我该如何手动进行?

请告知我是否还有其他或更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果您尝试构建本机应用程序,则可以使用以下代码。我试图使用Power Bi Rest API。一旦获得令牌,就可以在api调用中使用它。

public class PublicClient {

    private final static String AUTHORITY = "https://login.microsoftonline.com/common";
    private final static String CLIENT_ID = "XXXX-xxxx-xxx-xxx-xxxX";
    private final static String RESOURCE = "https://analysis.windows.net/powerbi/api";

    public static void main(String args[]) throws Exception {
        try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
            System.out.print("Enter username: ");
            String username = br.readLine();
            System.out.print("Enter password: ");
            String password = br.readLine();
            AuthenticationResult result = getAccessTokenFromUserCredentials(
                    username, password);
            System.out.println("Access Token - " + result.getAccessToken());
            System.out.println("Refresh Token - " + result.getRefreshToken());
            System.out.println("ID Token Expires on - " + result.getExpiresOn());
        }
    }

    private static AuthenticationResult getAccessTokenFromUserCredentials(
            String username, String password) throws Exception {
        AuthenticationContext context = null;
        AuthenticationResult result = null;
        ExecutorService service = null;
        try {
            service = Executors.newFixedThreadPool(1);
            context = new AuthenticationContext(AUTHORITY, false, service);
            Future<AuthenticationResult> future = context.acquireToken(
                    RESOURCE, CLIENT_ID, username, password, null);
            result = future.get();
        } finally {
            service.shutdown();
        }

        if (result == null) {
            throw new ServiceUnavailableException(
                    "authentication result was null");
        }
        return result;
    }
}