具有ADFS SAML身份验证的Java webservice客户端

具有ADFS SAML身份验证的Java webservice客户端,java,web-services,soap,saml,adfs,Java,Web Services,Soap,Saml,Adfs,我们正在尝试连接到具有ADFS SAML身份验证的webservice(来自Java) 我看到的所有示例都使用HTTPS上的基本身份验证。(我现在只是使用HttpsURLConnection发出请求,而不是使用Axis或JAX-WS之类的东西) 我不知道如何进行ADFS SAML身份验证。以下是我到目前为止所了解的情况(对SAML不太了解): 我提出一个请求,传递用户名/密码并获得 身份验证令牌返回 保存身份验证令牌 在调用 Web服务上的实际操作 不过,我不知道该将此身份验证令牌放在哪个属性下

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

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

我不知道如何进行ADFS SAML身份验证。以下是我到目前为止所了解的情况(对SAML不太了解):

  • 我提出一个请求,传递用户名/密码并获得 身份验证令牌返回
  • 保存身份验证令牌
  • 在调用 Web服务上的实际操作
  • 不过,我不知道该将此身份验证令牌放在哪个属性下
  • 我的上述方法正确吗?如果是这样的话,有没有我可以使用的图书馆来做这些

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


    请告诉我是否有其他或更好的方法来实现这一点。

    如果您试图构建本机应用程序,则可以使用以下代码。我尝试过使用power-bi-restapi。一旦获得令牌,就可以在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;
        }
    }
    
    公共类PublicClient{
    私有最终静态字符串权限=”https://login.microsoftonline.com/common";
    私有最终静态字符串客户端\u ID=“XXXX XXXX xxx XXXX”;
    私有最终静态字符串资源=”https://analysis.windows.net/powerbi/api";
    公共静态void main(字符串args[])引发异常{
    try(BufferedReader br=new BufferedReader(new InputStreamReader(System.in))){
    系统输出打印(“输入用户名:”);
    字符串username=br.readLine();
    系统输出打印(“输入密码:”);
    字符串密码=br.readLine();
    AuthenticationResult=getAccessTokenFromUserCredentials(
    用户名、密码);
    System.out.println(“访问令牌-”+result.getAccessToken());
    System.out.println(“刷新令牌-”+result.getRefreshToken());
    System.out.println(“ID令牌在-”+result.getExpiresOn()时过期);
    }
    }
    私有静态身份验证结果getAccessTokenFromUserCredentials(
    字符串用户名、字符串密码)引发异常{
    AuthenticationContext上下文=null;
    AuthenticationResult=null;
    ExecutorService=null;
    试一试{
    服务=Executors.newFixedThreadPool(1);
    context=新的AuthenticationContext(AUTHORITY、false、service);
    Future=context.acquireToken(
    资源、客户端ID、用户名、密码、空);
    结果=future.get();
    }最后{
    service.shutdown();
    }
    如果(结果==null){
    抛出新ServiceUnavailableException(
    “验证结果为空”);
    }
    返回结果;
    }
    }
    
    客户ID应该有什么?还有,AuthenticationResult和AuthenticationContext需要哪些库?@nullpointer Rahul Patel提供的源代码实现了OpenID Connect/OAuth 2.0协议,而不是SAML协议。客户端ID、访问令牌、刷新令牌和are ID令牌OpenID Connect/OAuth 2.0参数。@nullpointer
    com.microsoft.aad adal4j 0.0.2
    根据您的应用程序类型(本机/web应用程序),您需要在azure portal上注册应用程序,该应用程序将具有客户端ID。如果您有web应用程序,其他一些参数也会存在。所有的东西都在微软网站的某个地方很好地记录下来。