Java 需要使用另一个IDP实现支持身份验证/授权的IDP
我们需要实现一个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端执行此操作的方式 以下是定制阀门: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
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有更好的方法吗