Utilice la API de biblioteca SAML para crear una señal SAML
sender-vouches, que incluye el método de confirmación sender-vouches.
El método de confirmación sender-vouches se utiliza cuando un servidor
tiene que propagar la identidad o el comportamiento del cliente.
Acerca de esta tarea
Cuando la función SAML está instalada en un servidor
WebSphere, se proporciona
una API de biblioteca SAML. Utilice la biblioteca para crear una
señal SAML sender-vouches. Puede utilizar la API de biblioteca SAML para
crear los objetos de configuración SAML obligatorios. A continuación, utilice
esos objetos de configuración para generar una señal SAML sender-vouches.
Procedimiento
- Cree una instancia SAMLTokenFactory con la versión de la
señal SAML como parámetro.
- Utilice la siguiente línea de código para importar el método:
import com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory;
- Utilice una de las líneas de código siguientes para crear la instancia, en función de la versión de la señal.
- Después de crear la instancia, SAMLTokenFactory se utiliza para crear una instancia RequesterConfig, que determina cómo se
genera la señal, según los requisitos de autenticación del solicitante. Utilice esta línea de código para crear la instancia de RequesterConfig para
la señal sender-vouches:
RequesterConfig reqData = samlFactory.newSenderVouchesTokenGenerateConfig();
La instancia RequestConfig predeterminada es suficiente para generar una señal sender-vouches, pero se pueden incluir
aserciones adicionales en la señal SAML personalizando la instancia RequesterConfig. Por ejemplo, para incluir información
de autenticación mediante contraseña en la señal, utilice el método setAuthenticationMethod:
reqData.setAuthenticationMethod(“password”);
La validación de confianza para una aserción sender-vouches se localiza
con el remitente, no el emisor, por lo que el elemento Enveloped-Signature no es obligatorio en
la aserción. Para eliminar el elemento Enveloped-Signature de la aserción SAML, utilice el método
setAssertionSignatureRequired; por ejemplo:
reqData.setAssertionSignatureRequired(false);
- Utilice la API SAMLTokenFactory para crear una instancia ProviderConfig,
que describe el emisor de la señal. La instancia ProviderConfig especifica el nombre del emisor SAML, así como información de
almacén de claves y almacén de confianza, que identifica la clave para el cifrado y las firmas de SAML. La instancia ProviderConfig se crea utilizando los valores de propiedad de un archivo de propiedades. El archivo de propiedades especifica el valor predeterminado
del objeto ProviderConfig. En un entorno de cliente Java™, este archivo de propiedades se define mediante una propiedad del sistema de JVM,
com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath.
En el entorno de ejecución de
WebSphere Application Server, el nombre del archivo de propiedades es SAMLIssuerConfig.properties.
El archivo se puede localizar en el directorio de configuración de nivel de servidor o en el directorio de nivel de célula, en ese orden de prioridad.
Consulte el ejemplo siguiente de vía de acceso de nivel de servidor:
raíz_servidor_aplicaciones/profiles/$PROFILE/config/cells/$CELLNAME/nodes/$NODENAME/servers/$SERVERNAME/SAMLIssuerConfig.properties
Consulte el ejemplo siguiente de vía de acceso de nivel de célula:
raíz_servidor_aplicaciones/profiles/$PROFILE/config/cells/$CELLNAME/sts/SAMLIssuerConfig.properties
La propiedad del sistema de JVM, com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath, se ignora si la propiedad está definida en el entorno de ejecución del servidor.
Para obtener una descripción detallada de todas las propiedades, consulte la información acerca de la configuración de una señal SAML durante la creación de señales.
Utilice la siguiente línea de código para crear una instancia ProviderConfig predeterminada:
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(“any issuer name”);
El nombre del emisor es opcional. Si se especifica el nombre del emisor, éste aparece en la aserción SAML. Si no se especifica el nombre
del emisor, se utiliza como nombre de emisor una propiedad de nombre de emisor predeterminado del archivo
SAMLIssuerConfig.properties.
- Opcional: Al crear una nueva señal SAML, SAMLTokenFactory utiliza un sujeto JAAS (Java Authentication and Authorization Service) o una instancia
CredentialConfig para llenar la nueva señal SAML. Para utilizar un sujeto JAAS para llenar la señal, utilice la API com.ibm.websphere.security.auth.WSSubject
getCallerSubject() o a la API getRunAsSubject() para obtener un sujeto JAAS que represente
al cliente solicitante, o la identidad de la hebra de ejecución.
- Cuando se utiliza el sujeto JAAS para crear una nueva señal SAML, la
API SAMLTokenFactory busca un objeto SAMLToken en la lista PrivateCredentials
del sujeto. Si existe un objeto SAMLToken, se copian los objetos NameId o
NameIdentifier en la nueva señal SAML. SAMLTokenFactory también copia los atributos
SAML y el método AuthenticationMethod de la señal SAML
existente a la nueva señal SAML. La nueva señal SAML incluye un nuevo nombre de emisor,
un nuevo certificado de firma, un método de confirmación, una nueva KeyInfo para el
método de confirmación de holder-of-key y nuevas condiciones NotBefore y NotOnAfter. Estos valores de señal se determinan mediante los parámetros de configuración de
los objetos ProviderConfig y RequesterConfig.
Si no hay ningún objeto SAMLToken en el sujeto, sólo se copia el nombre de principal
WSPrincipal de sujeto a la nueva señal SAML. Ningún otro atributo del sujeto se copia
en la nueva señal SAML. De forma similar, el nombre del emisor, el certificado de firma,
el método de confirmación, la KeyInfo de holder-of-key y las condiciones NotBefore y
NotOnOrAfter se determinan mediante los parámetros de configuración de los objetos
ProviderConfig y RequesterConfig.
Como alternativa, puede utilizar el método RunAsSubject en la hebra de ejecución
para crear la señal SAML. Cuando utilice este
método, no pase el sujeto JAAS o el objeto CredentialConfig a la SAMLTokenFactory para crear la señal SAML. En su lugar,
el contenido de la señal SAML existente se copia en la señal SAML nueva,
tal como se ha descrito anteriormente.
- Otro método para crear una señal SAML es utilizar un objeto CredentialConfig para
llenar el NameId y los atributos de SAML mediante programación.
Utilice este método en
las circunstancias siguientes:
- Se deben incluir atributos de SAML personalizados en la nueva señal SAML.
- La señal SAML se crea manualmente en lugar de utilizar SAMLTokenFactory para
llenar la señal SAML a partir de un sujeto JAAS de forma automática.
- No existe ninguna señal SAML en el sujeto.
- No hay ningún sujeto JAAS disponible.
- Para crear un objeto CredentialConfig sin utilizar el sujeto JAAS,
utilice esta línea de código:
CredentialConfig cred = samlFactory.newCredentialConfig ();
No se proporciona
ningún valor inicial para este objeto CredentialConfig, por lo que debe utilizar métodos setter para llenar el objeto
CredentialConfig.
- Para llenar el NameIdentifier o el NameID de SAML, utilice la línea de código siguiente:
cred.setRequesterNameID("cualquier nombre");
El valor del parámetro pasado al método setRequesterNameID() se utiliza como nombre de principal
en la señal SAML. El nombre aparece en la aserción como NameIdentifier en una señal SAML Versión 1.1
o como NameId en la señal SAML Versión 2.0. Por ejemplo, si el valor del parámetro pasado al método setRequesterNameID() es Alice,
se genera la aserción siguiente en una señal SAML Versión 1.1:
<saml:NameIdentifier>Alice</saml:NameIdentifier>
La aserción siguiente se genera en una señal SAML de la versión 2.0:<saml2:NameID>Alice</saml2:NameID>
- Para incluir atributos de SAML en la parte <AttributeStatement> de una aserción, utilice este código:
SAMLAttribute samlAttribute = new SAMLAttribute("email" /* Name*/, new String[] {"joe@websphere"}
/*Attribute Values*/, null, "IBM WebSphere namespace" /* namespace*/, "email" /* format*/, "joe" /*friendly name */);
ArrayList<SAMLAttribute> al = new ArrayList<SAMLAttribute>();
al.add(samlAttribute)
sattribute = new SAMLAttribute("Membership", new String[] {"Super users", "Gold membership"}, null, null /* format*/, null, null );
al.add(samlAttribute );
cred.setSAMLAttributes(al);
Este código de ejemplo genera los siguientes aserciones de <Attribute>:<saml:Attribute AttributeName="email" NameFormat="email" AttributeNamespace="IBM WebSphere namespace">
<saml:AttributeValue>joe@websphere</saml:AttributeValue>
</saml:Attribute>
<saml:Attribute AttributeName="Membership">
<saml:AttributeValue>Super users</saml:AttributeValue><saml:AttributeValue>Gold membership</saml:AttributeValue>
</saml:Attribute>
- Genere una señal SAML sender-vouches utilizando esta línea de código:
SAMLToken samlToken = samlFactory.newSAMLToken(cred, reqData, samlIssuerCfg);
Este método exige el permiso de seguridad Java wssapi.SAMLTokenFactory.newSAMLToken.
En el apartado de ejemplo se incluyen ejemplos de código completos en los que se utilizan líneas de
código de los pasos anteriores.
Ejemplo
Utilice este código de ejemplo para crear una señal sender-vouches SAML versión 1.1
a partir del sujeto:
SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11)
RequesterConfig reqData = samlFactory.newSenderVouchesTokenGenerateConfig();
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(“WebSphere Server”);
Subject subject = com.ibm.websphere.security.auth.WSSubject.getRunAsSubject();
SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);
Utilice este código de ejemplo para crear una señal sender-vouches SAML versión 1.1 sin utilizar
el sujeto:
SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);
RequesterConfig reqData = samlFactory.newSenderVouchesTokenGenerateConfig();
reqData.setAuthenticationMethod("Password"); //Método de autenticación para la Assertion
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(Self issuer);
CredentialConfig cred = samlFactory.newCredentialConfig ();
cred.setRequesterNameID("Alice"); // SAML NameIdentifier
//Atributos SAML:
SAMLAttribute attribute = new SAMLAttribute
("email" /* Name*/, new String[] {"joe@websphere"}
/*Attribute Values in String*/,null
/*Attribute Values in XML */, "WebSphere" /* Namespace*/, "email" /* format*/, "joe" /*Friendly_name */);
ArrayList<SAMLAttribute> al = new ArrayList<SAMLAttribute>();
al.add(attribute);
attribute = new SAMLAttribute("Membership", new String[] {"Super users", "My team"}, null, null, null, null );
al.add(attribute);
cred.setSAMLAttributes(al);
SAMLToken samlToken = samlFactory.newSAMLToken(cred, reqData, samlIssuerCfg);