【问题标题】:Java webservice client with ADFS SAML authentication具有 ADFS SAML 身份验证的 Java Web 服务客户端
【发布时间】:2019-10-02 15:28:34
【问题描述】:

我们正在尝试连接到具有 ADFS SAML 身份验证的 webservice(来自 Java)。

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

我不确定如何处理 ADFS SAML 身份验证。以下是我目前所了解的(对SAML了解不多):

  1. 我提出一个请求,通过 用户名/密码 并获得 身份验证令牌返回
  2. 保存身份验证令牌
  3. 在我调用的调用中将令牌作为某些 SOAP 属性传递 webservice上的实际操作
  4. 不知道我会将这个身份验证令牌放在哪个属性下

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

如果没有,我该如何手动执行此操作?

如果有其他或更好的解决方法,请告诉我。

【问题讨论】:

    标签: java web-services soap saml adfs


    【解决方案1】:

    如果您正在尝试构建本机应用程序,则可以使用以下代码。我曾尝试使用 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;
        }
    }
    

    【讨论】:

    • CLIENT_ID 应该有什么? AuthenticationResult 和 AuthenticationContext 还需要哪些库?
    • @nullpointer Rahul Patel 提供的源代码实现了 OpenID Connect/OAuth 2.0 协议,而不是 SAML 协议。 CLIENT_ID、Access Token、Refresh Token,是 ID Token OpenID Connect/OAuth 2.0 参数。
    • @nullpointer &lt;dependency&gt; &lt;groupId&gt;com.microsoft.aad&lt;/groupId&gt; &lt;artifactId&gt;adal4j&lt;/artifactId&gt; &lt;version&gt;0.0.2&lt;/version&gt; &lt;/dependency&gt; 根据您的应用程序类型(本机/网络应用程序),您需要在 azure 门户上注册应用程序,对于该应用程序,您将拥有 CLIENT_ID。如果您有网络应用程序,其他一些参数也将在那里。所有东西都在微软网站的某个地方有很好的记录。
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多