Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要使用另一个IDP实现支持身份验证/授权的IDP_Java_Saml_Saml 2.0_Picketlink - Fatal编程技术网

Java 需要使用另一个IDP实现支持身份验证/授权的IDP

Java 需要使用另一个IDP实现支持身份验证/授权的IDP,java,saml,saml-2.0,picketlink,Java,Saml,Saml 2.0,Picketlink,我们需要实现一个IDP,该IDP支持使用另一个外部IDP进行身份验证/授权,除了标准的用户名/密码表单身份验证。 picketlink是否支持这种开箱即用的方案 以下是所需的组件: 依赖于我们的IDP的多个SP允许将其称为IDP Internal进行身份验证。 IDP Internal应支持使用LdapLoginModule和DatabaseLogingModule对不同用户组进行用户名/密码表单身份验证。它还应该支持使用另一个IDP进行身份验证,让我们称之为IDP External IDP E

我们需要实现一个IDP,该IDP支持使用另一个外部IDP进行身份验证/授权,除了标准的用户名/密码表单身份验证。 picketlink是否支持这种开箱即用的方案

以下是所需的组件:

依赖于我们的IDP的多个SP允许将其称为IDP Internal进行身份验证。 IDP Internal应支持使用LdapLoginModule和DatabaseLogingModule对不同用户组进行用户名/密码表单身份验证。它还应该支持使用另一个IDP进行身份验证,让我们称之为IDP External IDP External来自具有一些SAML扩展的外部提供程序。 目前,我们已经使用picketlink在picketlink示例中实现了SP和IDP内部。然而,IDP内部到IDP外部的集成目前是使用一些黑客借用的代码实现的,这些代码手工制作/解析SAML请求/响应,这里没有picketlink。 通过扩展picketlink的IDPWebbrowserval,我成功地将这段黑客代码集成到IDP Internal中。此自定义阀解析来自IDP External的传入SAMLResponse,并使用SAML2LoginModule执行本地容器身份验证,类似于在SP端执行此操作的方式

以下是定制阀门:

public class IDPInternalAuthentiationValve extends IDPWebBrowserSSOValve {
    @Override
    public void invoke(Request request, Response response) throws IOException, ServletException {
        String samlResponseXML = request.getParameter(GeneralConstants.SAML_RESPONSE_KEY);
        if (isNotNull(samlResponseXML)) {
            // This is a SAML Response from IDP-External
            // Parse SAML and get subjectName and roles
            // Lookup subject in an internal database and get local roles
            ServiceProviderSAMLContext.push(subjectName, combinedRoles);
            // Authenticate locally using SAML2LoginModule
            Principal principal = container.getRealm().authenticate(subjectName, ServiceProviderSAMLContext.EMPTY_PASSWORD);
            ServiceProviderSAMLContext.clear();

            Session session = request.getSessionInternal(false);
            // Save the authenticated Principal in our session
            session.setNote(Constants.FORM_PRINCIPAL_NOTE, principal);

            String samlRequestFromSession = (String)session.getNote(GeneralConstants.SAML_REQUEST_KEY);
            // This is the request from SP
            if (isNotNull(samlRequestFromSession)) {
                // Send a response back to SP using the principal created above
                processSAMLRequestMessage(request, response);
            }
        } else {
            // Username/password form authentication flow
            super.invoke(request, response);
        }
    }
}
这种解决方案虽然有效,但感觉有点粗糙。使用picketlink有更好的方法吗