La API de biblioteca SAML se puede utilizar para añadir atributos o suprimir atributos de una señal SAML que no está cifrada y, a
continuación, firmar o volver firmar la señal SAML. Cuando se realicen acciones para modificar el objeto de señal SAML, si ya existe una firma
digital en el objeto, la firma digital existente se eliminará.
Acerca de esta tarea
El procedimiento siguiente describe cómo modificar un objeto SAMLToken existente y, a continuación, aplicar una firma digital nueva a la señal.
Esta tarea no muestra cómo obtener el objeto SAMLToken existente. El objeto SAMLToken existente puede proceder de un SOAP de entrada por medio del
estado
compartido LoginModule, de un SSO web SAML por medio del mediante el sujeto de seguridad base, de un STS que utiliza el cliente de confianza o
de una señal
autoemitida que se crea con las API SAML.
Cuando las API SAML inicializan objetos de configuración, la configuración se obtiene de
SamlIssuerConfig.properties. Puede optar por utilizar los valores de SamlIssuerConfig.properties o alterarlos
temporalmente. Este procedimiento muestra cómo alterar temporalmente todos los valores de este archivo.
Procedimiento
- Clone la señal SAML existente
import java.util.ArrayList;
import org.apache.axiom.om.OMElement;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory;
import com.ibm.wsspi.wssecurity.saml.config.ProviderConfig;
import com.ibm.wsspi.wssecurity.saml.config.RequesterConfig;
import com.ibm.wsspi.wssecurity.saml.data.SAMLAttribute;
import com.ibm.wsspi.wssecurity.wssapi.OMStructure;
....
//someSAMLToken es el objeto SAMLToken existente
SAMLTokenFactory samlFactory = null;
//inicializar la fábrica de señales SAML deseada
//samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);
samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV20Token11);
//clonar el objeto SAMLToken existente si se desea.
SAMLToken mySamlToken = factory.newSAMLToken(someSamlToken);
- Añada atributos o suprima atributos de la señal
//añadir un solo atributo
SAMLAttribute sattribute1 = new SAMLAttribute("Purchases", new String[] {"TooMany"}, null, null, null, null);
mySamlToken.addAttribute(sattribute1);
//después de este primer addAttribute, no habrá una firma digital en el
//XML de la señal. Una modificación de la señal ha invalidado la firma.
//añadir una lista de atributos
SAMLAttribute sattribute2 = new SAMLAttribute("Address", new String[] {"Austin, Texas"},null,null,"IBM NameFormat","IBM FriendlyName");
SAMLAttribute sattribute3 = new SAMLAttribute("Membership",new String[] {"Blue team", "Green Team"},null,null,null,null );
ArrayList al = new ArrayList();
al.add(sattribute2);
al.add(sattribute3);
mySamlToken.addAttribute(al);
//suprimir un atributo
mySamlToken.deleteAttribute(sattribute3);
....
- Vuelva a firmar la señal SAML.
RequesterConfig reqData = null;
//inicializar la configuración del peticionario deseado
//reqData = samlFactory.newSenderVouchesTokenGenerateConfig();
reqData = samlFactory.newBearerTokenGenerateConfig();
//inicializar el objeto de configuración del proveedor con un nombre de emisor
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig("myIssuer");
//O conservar el emisor existente estableciendo el URI del emisor en nulo
//samlIssuerCfg.setIssuerURI(null);
//establecer la información de almacén de claves para su uso con firma digital en el objeto de configuración del proveedor
KeyStoreConfig ksc = samlFactory.newKeyStoreConfig( "jks", "/myx509.ks", "myx509");
samlIssuerCfg.setKeyStoreConfig(ksc);
//establecer la información de claves para su uso con firma digital en el objeto de configuración del proveedor
KeyInformationConfig kic = samlFactory.newKeyInformationConfig("mySignAlias", "password", "CN=ME");
samlIssuerCfg.setKeyInformationConfig(kic);
//crear un nuevo objeto SAMLToken que es un clon firmado de la señal de entrada
SAMLToken myNewSamlToken = samlFactory.newSAMLToken(mySamlToken,reqData,samlIssuerCfg);
- Inspeccione el XML de la señal SAML para ver las modificaciones
//obtener el elemento de aserción SAML
OMElement samlElement = ((OMStructure) myNewSamlToken.getXML()).getNode();
//convertir el elemento a una Serie
String xmlString = samlElement.toString();