ACS请求URL中的SAMLResponse为null:使用onelogin工具包

时间:2016-10-21 11:10:32

标签: java web-services saml-2.0 onelogin

我正在使用Onelogin 2.0 toolkit。我没有将Login和ACS作为jsp文件添加为休息服务。当我的IdP重定向到ACS服务URL时,我收到此错误。

  

找不到SAML响应,仅支持HTTP_POST绑定

在对ACS服务的请求中,SAMLResponse参数将变为null。我该如何解决这个问题?

@Path("/saml")
public class SAMLAuthService {
    @Context
    HttpServletRequest request;

    @Context
    HttpServletResponse response;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/dologin")
    public void SAMLLogin(){
        try {
            Auth auth = new Auth(CommonUtils.samlPropertyFileName,request, response);
            System.out.println("Calling SAML Login::");
            auth.login();
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Path("/acs")
    public Response SAMLACS()
            throws ExecException {
        Response samlResponse = null;
        try {
            System.out.println("Calling SAML ACS::");
            Auth auth = new Auth(CommonUtils.samlPropertyFileName,request, response);
            auth.processResponse();
            if (!auth.isAuthenticated()) {
                System.out.println("Not Authenticated");
            }

            List<String> errors = auth.getErrors();
            if (!errors.isEmpty()) {
                if (auth.isDebugActive()) {
                    String errorReason = auth.getLastErrorReason();
                    if (errorReason != null && !errorReason.isEmpty()) {
                        System.out.println(errorReason);
                    }
                }
            } else {
                Map<String, List<String>> attributes = auth.getAttributes();
                String nameId = auth.getNameId();
                System.out.println("NameId::"+nameId);
                if (attributes.isEmpty()) {
                    System.out.println("No Attributes");
                }
                else {
                    Collection<String> keys = attributes.keySet();
                    for(String name :keys){
                        List<String> values = attributes.get(name);
                        System.out.println(name+"::");
                        for(String value :values) {
                            System.out.print(value);
                        }

                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return samlResponse;
    }

}

1 个答案:

答案 0 :(得分:2)

您正在使用的Auth构造函数需要具有SAMLResponse POST参数的HttpServletRequest请求对象

如果您没有该HttpServletRequest对象,可以使用makeHttpRequest

构建它

您可以使用SAML Tracer分析IdP和SP之间的SAML流程。您可能确定IdP正在发送SAMLResponse。我不熟悉您正在使用的“Rest方法”,但您可能会看到获取SAMLResponse并构建注入该参数的HttpServletRequest对象的方法。